2011-01-02 1 views
0

Я использую AutoCompleteBox из инструментария wpf, и я реализую заполнение своим собственным , так как есть много данных, и я хочу выполнить поиск в фоновом потоке.Autocomplete with BackgroundWorker не работает

это то, что heppans, когда я ищу номер 12. пока он должен показать мне 4 результата - 12,120,121,122.

Что я делаю неправильно?

Руководство по MSDN, что я попытался Folow: http://msdn.microsoft.com/en-us/library/system.windows.controls.autocompletebox.populating(VS.95).aspx

alt text

XAML:

<Grid> 
    <Controls:AutoCompleteBox x:Name="txtSearch" Populating="AutoCompleteBox_Populating" Height="30" Background="Beige" /> 
</Grid> 

код позади:

public partial class Window1 : Window { 

    private int MAX_NUM_OF_RESULTS = 3; 

    public List<Person> Persons { get; set; } 
    public List<string> Results { get; set; } 

    public Window1() { 
     InitializeComponent(); 

     Persons = new List<Person>(); 
     for (var i = 0; i < 1000000; i++) { 
      Persons.Add(new Person { Name = i.ToString() }); 
     } 

     Results = new List<string>(); 
    } 

    private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e) { 

     e.Cancel = true; 

     var b = new BackgroundWorker(); 
     b.RunWorkerAsync(txtSearch.SearchText); 
     b.DoWork += b_DoWork; 
     b.RunWorkerCompleted += b_RunWorkerCompleted; 
    } 

    void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     txtSearch.ItemsSource = Results; 
     txtSearch.PopulateComplete(); 
    } 


    void b_DoWork(object sender, DoWorkEventArgs e) { 

     Results.Clear(); 
     var counter = 0; 

     foreach (var person in Persons) { 
      if (person.Name.StartsWith(e.Argument.ToString())) { 
       Results.Add(person.Name); 
       counter++; 

       if (counter > MAX_NUM_OF_RESULTS) { 
        break; 
       } 
      } 
     } 
    } 
} 

класса Person:

public class Person { 
    public string Name; 
} 

ответ

1

Вы уверены, что ваша логика поиска фактически выполняется? Если да, ожидаются ли результаты в результатах до их назначения в ItemsSource?

Я думаю, что это:

var b = new BackgroundWorker(); 
    b.RunWorkerAsync(txtSearch.SearchText); 
    b.DoWork += b_DoWork; 
    b.RunWorkerCompleted += b_RunWorkerCompleted; 

Должно быть так:

var b = new BackgroundWorker(); 
    b.DoWork += b_DoWork; 
    b.RunWorkerCompleted += b_RunWorkerCompleted; 
    b.RunWorkerAsync(txtSearch.SearchText); 

В противном случае вы рискуете имея начало уборщица перед установкой обработчиков событий.

4

Попробуйте изменить порядок к следующему

var b = new BackgroundWorker(); 
b.DoWork += b_DoWork; 
b.RunWorkerCompleted += b_RunWorkerCompleted; 
b.RunWorkerAsync(txtSearch.SearchText);