实际项目中我们往往有这样的需求
<a href="http://www.024hi.com/Images/cnblogs/SilverlightPagedCollectionView_14D6E/image.png"></a>
即通过复选框动态的筛选DataGird的相关项,比如上面截图所示例的筛选Gender列特定项。有的朋友可能已经想到了:直接操作ObservableCollection不就行了吗?其实这样做存在两个问题:
PagedCollectionView本来就提供了筛选功能,操作ObservableCollection是不是显得有点蠢了?
操作ObservableCollection后(筛选的时候一般是移除项),集合本身也发生了变化,而PagedCollectionView提供的筛选只是在UI中反映变化而不会改变集合项
既然有如上两个问题,那么我们还是老老实实的使用PagedCollectionView的Filter属性实现筛选吧
不过依然是存在问题的,这个暂且不说,先看一下正常情况下我们要实现以上需求需要做的工作
首先要在XAML中添加四个复选框
将三个CheckBox一个StackPanel中除了布局需要外,还可以方便我们遍历出所有的CheckBox以便过滤操作。
接下来,我们需要在CheckBox_Click的cs代码中做如下工作
如果只有一个CheckBox(比如:男),我们可以简单的这样
可现在我们有N个CheckBox,鉴于PagedCollectionView的Filter又是一个Predicate<object>,所以我们只能这样(这里我们假设只有两个CheckBox的情况,因为实在是太麻烦了)
可见要是再多几个复选框,这些判断就要搞死人了。解决这个问题的关键就是动态构建Predicate,所以这里我们编写一个PredicateBuilder通过拼接表达式来辅助我们动态构建Predicate
代码比较简单,就不多解释了。注意最后的ConvertToPredicate<T>这个扩展方法用来将构建好的Expression编译后的Func<T,bool>转换为Predicate<T>。
有了这个类的辅助后,我们的CheckBox_Click事件可就既省事又优雅多了
<a href="http://11011.net/software/vspaste"></a>
到此为止问题解决,希望能对搞Sl企业级开发的兄弟们有所帮助
Okay,have fun~
本文转自紫色永恒51CTO博客,原文链接:http://www.cnblogs.com/024hi/archive/2009/12/12/1622795.html ,如需转载请自行联系原作者