在Silverlight DataGrid中使用PagedCollectionView进行数据过滤

在之前的一篇文章中,讨论了如何使用PagedCollectionView对数据记录进行分组。在本文中,将探讨如何利用PagedCollectionView根据搜索关键字过滤记录。虽然代码不多,但通过这个类可以轻松实现过滤功能。还将学习如何在分组记录的基础上进行过滤。请继续阅读本文以了解更多详情。

如果还没有阅读之前的文章,请先阅读那篇文章(“在SilverlightDataGrid中使用PagedCollectionView进行分组记录”),然后再阅读本文。这将有助于更好地理解基本需求和代码。现在,让进入本文的主题。在某些情况下,需要根据搜索关键字过滤DataGrid记录。DataGrid可能包含大量数据,在这种情况下,查找特定记录非常困难。这时,需要过滤记录。

XAML设计

首先,需要重新设计现有的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); } /// /// Filters the records. /// /// The obj. /// private bool FilterRecords(object obj) { var employee = obj as Employee; return employee != null && (employee.Firstname.ToLower().IndexOf(searchKey) >= 0 || employee.Lastname.ToLower().IndexOf(searchKey) >= 0 || employee.City.ToLower().IndexOf(searchKey) >= 0 || employee.State.ToLower().IndexOf(searchKey) >= 0); }

会发现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’的记录都已正确过滤。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485