Автозаполнение с BackgroundWorker не работает - PullRequest
0 голосов
/ 02 января 2011

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

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

Что я делаю не так?

Руководство по msdn, которое я пытался выполнить: 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;
                }
            }
        }
    }
}

Классное лицо:

 public class Person {
    public string Name;
}

Ответы [ 2 ]

4 голосов
/ 02 января 2011

Попробуйте изменить порядок на

var b = new BackgroundWorker();
b.DoWork += b_DoWork;
b.RunWorkerCompleted += b_RunWorkerCompleted;
b.RunWorkerAsync(txtSearch.SearchText);
1 голос
/ 02 января 2011

Вы уверены, что ваша логика поиска действительно выполняется?Если да, то являются ли ожидаемые результаты в Результатах до назначения их для 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);

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

...