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
不会有帮助。但是,这个锁不会导致它显示以前的结果,而不是当前结果吗?我不这么认为,它只是强制以原子方式处理调用。试试看。。。。