我编写了一个简单的代码来允许对我的数据网格进行过滤,但是我在代码中犯了一个错误。但它仍然按预期工作。
这是我做的:
ICollectionView
第四点是我弄错了。我应该将视图绑定到DataGrid,而不是源,对吧?
以下是代码:
var mySources = GettingMySource();
var myView = CollectionViewSource.GetDefaultView(mySources);
myView.Filter = MyFilter;
DataGrid.ItemsSource = mySources;
我的代码中的其他地方(当用户输入过滤器时),我只需要调用:
myView.Refresh();
它的工作原理......与我的过滤器不匹配的元素将从CollectionView和UI中删除,但我的源列表未更改...
有人可以解释一下这是如何起作用的吗?
答案 0 :(得分:3)
MSDN说:
所有集合都有默认的CollectionView。 WPF始终绑定到视图而不是集合。如果直接绑定到集合,WPF实际上绑定到该集合的默认视图。此默认视图由集合的所有绑定共享,这会导致对集合的所有直接绑定共享一个默认视图的排序,过滤器,组和当前项特征。
因此,当您告诉DataGrid使用源时,它仍然会自动获取在所有绑定上共享的(默认)视图,并将过滤器应用于它。
它也说
此默认视图从不与任何CollectionViewSource对象相关联。
因此,如果您已将过滤器应用于View
的{{1}}而非默认视图,则不会进行过滤。
答案 1 :(得分:0)
我应该将视图绑定到DataGrid,而不是源,对吧?
是。 CollectionView是集合和DataGrid之间的一个层。它允许您对集合中的项目进行导航,排序,过滤和分组,而无需实际修改原始集合。因此,行DataGrid.ItemsSource = mySources;
错误,您应该将其绑定到myView
。
与我的过滤器不匹配的元素将从中删除 CollectionView和UI,但我的源列表没有改变......
如果您的目标是从CollectionView获取已过滤的项目列表,则应使用Cast
扩展方法:
var filteredData = myView.Cast<Entity>()