在之前的一篇文章中,讨论了如何使用PagedCollectionView对数据记录进行分组。在本文中,将探讨如何利用PagedCollectionView根据搜索关键字过滤记录。虽然代码不多,但通过这个类可以轻松实现过滤功能。还将学习如何在分组记录的基础上进行过滤。请继续阅读本文以了解更多详情。
如果还没有阅读之前的文章,请先阅读那篇文章(“在SilverlightDataGrid中使用PagedCollectionView进行分组记录”),然后再阅读本文。这将有助于更好地理解基本需求和代码。现在,让进入本文的主题。在某些情况下,需要根据搜索关键字过滤DataGrid记录。DataGrid可能包含大量数据,在这种情况下,查找特定记录非常困难。这时,需要过滤记录。
首先,需要重新设计现有的XAML页面,添加一个搜索TextBox,如下所示:
为此,需要一个TextBlock(可选)来标记TextBox。TextBox是必填字段,将在这里输入搜索查询。当最终用户在这里输入内容时,DataGrid将过滤记录。以下是完整的XAML供参考:
会发现,这里的改动并不大。使用了一个额外的StackPanel来使应用程序UI布局更加清晰和合适。
现在是编写ViewModel中代码进行过滤的时候了。请确保将使用之前使用的类“PagedCollectionView”。因此,对集合也很熟悉。添加一个名为“searchKey”的私有字符串变量,将在内部使用它来实现功能。现在,编写一个名为“FilterDataBySearchKey()”的新方法,将搜索关键字传递给它以存储在成员变量中。会发现,PagedCollectionView有一个名为“Filter”的属性,它接受Predicate。这个Filter谓词将为需求做技巧。在这里,PagedCollectionView是集合“Employees”。首先,将此集合的Filter设置为null以移除之前的过滤。然后,设置一个新的谓词函数调用。在谓词操作内部,执行过滤机制。以下是ViewModel代码,以帮助理解:
private string searchKey;
///
/// Filters the data by search key.
///
/// The search key.
public void FilterDataBySearchKey(string searchKey)
{
this.searchKey = searchKey;
Employees.Filter = null;
Employees.Filter = new Predicate
会发现FilterRecords()是PagedCollectionsView的Filter键的实际谓词。在这里,搜索“searchKey”是否存在于Firstname、Lastname、City或State中,使用IndexOf()。这将在值的任何位置搜索匹配的关键字。如果想实现它以字符串的第一个字符开始,也可以使用StartsWith()。只搜索Firstname、Lastname、City和State。可以从实际逻辑中包含更多或减少一些。由于实际代码已经准备好了,需要将其与TextChanged事件集成。为此,请转到代码后台文件,并在TextBox_TextChanged事件中,从TextBox的Text获取搜索关键字,并将其传递给viewmodel的方法。以下是相同的代码:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
string searchKey = (sender as TextBox).Text.Trim().ToLower();
(Resources["MainViewModel"] as MainViewModel).FilterDataBySearchKey(searchKey);
}
到目前为止,已经实现了完整的代码。示例不需要更多的代码。让开始运行应用程序,看看它是否有效,以便能够理解代码是否正常工作。
让构建源代码并运行应用程序。将看到与之前文章中演示的相同的UI。唯一的变化是有一个TextBox,要求输入搜索关键字以过滤记录。
开始在过滤框中输入内容。会注意到,记录会根据输入的术语自动过滤。这种过滤仅适用于实现逻辑的Firstname、Lastname、City和State。
很好,对吗?想知道它是否适用于分组数据?让试试。按部门对记录进行分组,然后在搜索框中输入内容。
会发现,记录现在根据键过滤,但以分组的方式,即按部门分组。
修改为不同的搜索词。会注意到,当在搜索框中输入内容时,变化会在几秒钟内发生。
注意到所有过滤都是以搜索关键字开头的值进行的。让检查它如何适用于值中间的搜索关键字。
在TextBox中输入‘w’,会发现任何值中包含‘w’的记录都已正确过滤。