六安网站制作人才招聘,如何自己建设简单的手机网站首页,如何在外管局网站做延期,wordpress网站打开慢在之前的文章中提到#xff0c;PagedCollection提供了筛选#xff08;Filter#xff09;功能。 实际项目中我们往往有这样的需求 即通过复选框动态的筛选DataGird的相关项#xff0c;比如上面截图所示例的筛选Gender列特定项。有的朋友可能已经想到了#xff1a;直接操作O…在之前的文章中提到PagedCollection提供了筛选Filter功能。 实际项目中我们往往有这样的需求 即通过复选框动态的筛选DataGird的相关项比如上面截图所示例的筛选Gender列特定项。有的朋友可能已经想到了直接操作ObservableCollection不就行了吗其实这样做存在两个问题 PagedCollectionView本来就提供了筛选功能操作ObservableCollection是不是显得有点蠢了 操作ObservableCollection后筛选的时候一般是移除项集合本身也发生了变化而PagedCollectionView提供的筛选只是在UI中反映变化而不会改变集合项 既然有如上两个问题那么我们还是老老实实的使用PagedCollectionView的Filter属性实现筛选吧 不过依然是存在问题的这个暂且不说先看一下正常情况下我们要实现以上需求需要做的工作 首先要在XAML中添加四个复选框 StackPanel OrientationHorizontal x:NamecbContainerCheckBox Content男 IsCheckedTrue ClickCheckBox_Click/CheckBox Content女 IsCheckedTrue ClickCheckBox_Click /CheckBox Content无 IsCheckedTrue ClickCheckBox_Click /
/StackPanel 将三个CheckBox一个StackPanel中除了布局需要外还可以方便我们遍历出所有的CheckBox以便过滤操作。 接下来我们需要在CheckBox_Click的cs代码中做如下工作 如果只有一个CheckBox比如男我们可以简单的这样 string genderToFilter ((CheckBox)sender).Content.ToString();
_pcv.Filter p ((Person)p).Gender genderToFilter; 可现在我们有N个CheckBox鉴于PagedCollectionView的Filter又是一个Predicateobject所以我们只能这样这里我们假设只有两个CheckBox的情况因为实在是太麻烦了 var els cbContainer.Children;var cb1 els[0] as CheckBox;var cb2 els[1] as CheckBox;Predicateobject predicate;if (cb1.IsChecked true || cb2.IsChecked false) {predicate p ((Person)p).Gender cb1.Content.ToString();}else if (cb1.IsChecked true || cb2.IsChecked false) {predicate p ((Person)p).Gender cb1.Content.ToString() || ((Person)p).Gender cb2.Content.ToString();}else {predicate p ((Person)p).Gender cb2.Content.ToString();}_pcv.Filter predicate; 可见要是再多几个复选框这些判断就要搞死人了。解决这个问题的关键就是动态构建Predicate所以这里我们编写一个PredicateBuilder通过拼接表达式来辅助我们动态构建Predicate public static class PredicateBuilder {public static ExpressionFuncT, bool TrueT() { return f true; }public static ExpressionFuncT, bool FalseT() { return f false; }public static ExpressionFuncT, bool OrT(this ExpressionFuncT, bool expr1,ExpressionFuncT, bool expr2) {var invokedExpr Expression.Invoke(expr2, expr1.Parameters.CastExpression());return Expression.LambdaFuncT, bool(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);}public static ExpressionFuncT, bool AndT(this ExpressionFuncT, bool expr1,ExpressionFuncT, bool expr2) {var invokedExpr Expression.Invoke(expr2, expr1.Parameters.CastExpression());return Expression.LambdaFuncT, bool(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);}public static PredicateT ConvertToPredicateT(this FuncT, bool func) {return new PredicateT(func);}} 代码比较简单就不多解释了。注意最后的ConvertToPredicateT这个扩展方法用来将构建好的Expression编译后的FuncT,bool转换为PredicateT。 有了这个类的辅助后我们的CheckBox_Click事件可就既省事又优雅多了 private void CheckBox_Click(object sender, RoutedEventArgs e) {var els cbContainer.Children;var predicate PredicateBuilder.Falseobject();foreach (var el in els) {var cb el as CheckBox;if (cb.IsChecked true) {predicate predicate.Or(p ((Person)p).Gender cb.Content.ToString());}}_pcv.Filter predicate.Compile().ConvertToPredicateobject();} 到此为止问题解决希望能对搞Sl企业级开发的兄弟们有所帮助 Okay,have fun~转载于:https://www.cnblogs.com/024hi/archive/2009/12/12/1622795.html