C# 文本更改问题

C# 文本更改问题,c#,windows-8,windows-runtime,windows-8.1,C#,Windows 8,Windows Runtime,Windows 8.1,你好,我有一个搜索框,这是一个文本框,过滤列表框 我有一个项目数组,代码将执行以下操作: private async void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e) { ListBox.Items.Clear(); foreach (Item a in arr) { if(a.Title.Contains(SearchTextBox.Text))

你好,我有一个搜索框,这是一个文本框,过滤列表框

我有一个项目数组,代码将执行以下操作:

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个符号时,所有操作都正常,但当我按住backspace键时,会发生一些奇怪的情况,项目开始复制或更改其位置-有什么问题,如何防止出现这种情况?

好的,我看到这是异步的,您需要同步此方法

创建名为_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);
       }
    }
  }
}

在循环时,可能会在同一线程(UI线程)上重新输入处理程序。一种选择是在进入时分离处理程序,然后在退出时重新连接。您可能需要进行双重检查,以确保在将其拆下时没有发生任何其他情况

我对window8应用不太熟悉,但基于
文本框
过滤
列表框
是很常见的。我希望您能够使用类似于
CollectionViewSource.Filter
的工具来自动进行过滤(请参见此示例)

基本实施:

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

这会有什么帮助呢?我已经修改了,我现在意识到这是一个异步方法,所以你的列表框会被多个执行线程修改。它需要同步。仅仅因为它是异步的并不意味着有多个线程。该方法可能正在同一线程上重新输入。在这种情况下,
lock
不会有帮助。但是,这个锁不会导致它显示以前的结果,而不是当前结果吗?我不这么认为,它只是强制以原子方式处理调用。试试看。。。。