/// <summary>
/// 1.0.6
/// </summary>
public abstract class AutoCompleteSelector : AutoCompleteBox
{
private IAutoCompleteSelectorDataProvider dataProvider;
private bool allowSearch = false;
public AutoCompleteSelector(IAutoCompleteSelectorDataProvider dataProvider)
{
this.dataProvider = dataProvider;
this.Loaded += new RoutedEventHandler(AutoCompleteSelectorLoaded);
}
protected abstract IDictionary<string, object> GetParameters();
void AutoCompleteSelectorLoaded(object sender, RoutedEventArgs e)
{
this.KeyDown += new KeyEventHandler(AutoCompleteSelector_KeyDown);
this.KeyUp += new KeyEventHandler(AutoCompleteSelector_KeyUp);
this.TextChanged += new RoutedEventHandler(AutoCompleteSelectorTextChanged);
this.SelectionChanged += new SelectionChangedEventHandler(AutoCompleteSelectorSelectionChanged);
this.ItemsSource = new ObservableCollection<string>();
}
void AutoCompleteSelector_KeyUp(object sender, KeyEventArgs e)
{
timeCount = 3;
if (allowSearch)
{
if (!isRunning)
{
thread = new Thread(new ThreadStart(ThreadProcess));
thread.Start();
}
}
}
void AutoCompleteSelector_KeyDown(object sender, KeyEventArgs e)
{
allowSearch = true;
this.SelectedItem = null;
}
void AutoCompleteSelectorTextChanged(object sender, RoutedEventArgs e)
{
}
void AutoCompleteSelectorSelectionChanged(object sender, SelectionChangedEventArgs e)
{
allowSearch = false;
}
private bool isRunning;
private int timeCount = 0;
private Thread thread;
private void ThreadProcess()
{
isRunning = true;
while (timeCount != 0)
{
timeCount--;
Thread.Sleep(100);
}
this.Dispatcher.BeginInvoke(new Action(() =>
{
dataProvider.SearchData(this.Text, GetParameters(), (result) =>
{
var tempItems = this.ItemsSource as ObservableCollection<string>;
tempItems.Clear();
if (result != null)
{
foreach (var item in result)
{
tempItems.Add(item);
}
}
this.PopulateComplete();
});
}));
isRunning = false;
}
}
public interface IAutoCompleteSelectorDataProvider
{
void SearchData(string text, IDictionary<string, object> paramaters, Action<ObservableCollection<string>> callback);
}