【问题标题】:Autocomplete with BackgroundWorker does not work使用 BackgroundWorker 自动完成功能不起作用
【发布时间】:2011-01-02 12:53:49
【问题描述】:

我正在使用 wpf 工具包中的 AutoCompleteBox,我自己实现了填充 因为有很多数据,我想在后台线程中进行搜索。

当我搜索数字 12 时,这就是所发生的事情。 虽然它应该显示 4 个结果 - 12,120,121,122。

我做错了什么?

我尝试关注的 msdn 指南:http://msdn.microsoft.com/en-us/library/system.windows.controls.autocompletebox.populating(VS.95).aspx

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;
}

【问题讨论】:

    标签: wpf multithreading backgroundworker autocompletebox


    【解决方案1】:

    尝试将顺序更改为以下

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

    【讨论】:

      【解决方案2】:

      您确定您的搜索逻辑正在实际执行吗?如果是这样,在将结果分配给 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);
      

      否则,您可能会在设置事件处理程序之前让工作程序启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-28
        • 2020-11-14
        • 2014-03-11
        • 2014-01-16
        • 2011-03-14
        • 2013-12-23
        • 2018-01-10
        • 2016-02-24
        相关资源
        最近更新 更多