Text_Changed问题

时间:2013-12-20 07:47:14

标签: c# windows-8 windows-runtime windows-8.1

您好我有一个搜索框,即TextBox,用于过滤ListBox。

我有一系列项目,代码接下来会做:

private async void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    ListBox.Items.Clear();
    foreach (Item a in arr)
    {
         if(a.Title.Contains(SearchTextBox.Text))
         {
             ListBox.Items.Add(a);
         }
    }
}

当我删除1个符号时,一切正常,但是当我按住退格键时会发生奇怪的事情,项目开始重复或改变其位置 - 问题是什么以及如何防止这种情况?

2 个答案:

答案 0 :(得分:1)

在循环时,您可能会在同一个线程(UI线程)上重新进入处理程序。一种选择是在进入时分离处理程序,然后在退出时重新附加。您可能需要进行双重检查,然后在分离时没有其他任何事情发生。

我对Window 8应用程序并不熟悉,但基于ListBox过滤TextBox非常常见。我希望您能够使用CollectionViewSource.Filter之类的内容自动进行过滤(请参阅此question以获取示例)。

基本实施:

private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    string initialText = SearchTextBox.Text;
    SearchTextBox.TextChanged -= SearchTextBox_TextChanged;
    do
    {
        ListBox.Items.Clear();
        foreach (Item a in arr)
        {
             if(a.Title.Contains(initialText))
             {
                ListBox.Items.Add(a);
             }
        }
    } while (SearchTextBox.Text != initialText)
    SearchTextBox.TextChanged += SearchTextBox_TextChanged;
}

答案 1 :(得分:0)

好的,我发现这是异步的,你需要同步这个方法

创建名为_syncRoot的实例对象:

private object _syncRoot = new Object();


private async void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
  lock( _syncRoot) 
  {
    ListBox.Items.Clear();
    foreach (Item a in arr)
    {
       if(a.Title.Contains(SearchTextBox.Text))
       {
           ListBox.Items.Add(a);
       }
    }
  }
}