WP7搜索文本框textchanged事件

时间:2012-05-03 06:53:32

标签: windows-phone-7

我的wp7应用程序中要求我必须在搜索文本框上的每个按键上的列表集合(例如联系人列表)上进行部分匹配搜索(多个字段表示名字和姓氏)并绑定到列表框。我写了linq查询来获得texchanged事件的结果。我得到了预期的结果,但是如果我在集合中有超过500个项目,它就不会很快响应。

我已经发布了以下代码,如果有人可以帮我解决性能问题,我真的很感激。

private void TechChanged(object sender, TextChangedEventArgs e)
{
    IList<Contacts> results = searchcontList
            .Where(tb => tb.SearchText.Contains(textsearch.Text))
            .ToList();

    //"SearchText" is an attribute in contacts class which is concatination values of all the fields in contacts class
    listcontact.ItemsSource = results;
}

1 个答案:

答案 0 :(得分:3)

您很可能无法提高搜索性能(即查找匹配项目并将其呈现给UI所花费的时间) - 因此您需要查看更改应用程序的工作方式让它感觉更敏感。

您是否真的需要对输入TextBox中的每个字符执行搜索?

您的问题的常见解决方案是一个名为“限制”的概念,您只在用户暂停文本条目一段时间后执行搜索。您可以使用Reactive Extensions轻松完成此操作,如下所示:

Observable.FromEvent<TextChangedEventArgs>(searchTextBox, "TextChanged")
          .Select(e => ((TextBox)e.Sender).Text)            
          .Where(text => text.Length > 2)
          .Throttle(TimeSpan.FromMilliseconds(400))         
          .Subscribe(txt => // do your search here!);   

上面的代码确保在开始搜索之前有两个以上的字符,并且限制以确保每400毫秒只执行一次搜索。有关更多详细信息,请参阅我编写的codeproject文章:

Exploring Reactive Extensions (Rx) through Twitter and Bing Maps Mashups