您好我有一个搜索框,即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个符号时,一切正常,但是当我按住退格键时会发生奇怪的事情,项目开始重复或改变其位置 - 问题是什么以及如何防止这种情况?
答案 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);
}
}
}
}