WPF 绑定错误但 CollectionView 仍在过滤

WPF wrong binding but CollectionView still filtering

我写了一个简单的代码来允许在我的数据网格上进行过滤,但是我在我的代码中犯了一个错误。但它仍然按预期工作。

这是我所做的:

  1. 获取源项目(从数据库)
  2. 从中创建 ICollectionView
  3. 正在设置我的自定义过滤器
  4. source 绑定到 DataGrid 而不是 view

第四点是我错误的地方。我应该将 view 绑定到 DataGrid,而不是 source,对吗?

代码如下:

var mySources = GettingMySource();

var myView = CollectionViewSource.GetDefaultView(mySources);
myView.Filter = MyFilter;

DataGrid.ItemsSource = mySources;

我代码中的其他地方(当用户输入过滤器时),我只是调用:

myView.Refresh();

它有效...与我的过滤器不匹配的元素已从 CollectionView 和 UI 中删除,但我的源列表未更改...

谁能给我解释一下这是怎么回事?

MSDN 说:

All collections have a default CollectionView. WPF always binds to a view rather than a collection. If you bind directly to a collection, WPF actually binds to the default view for that collection. This default view is shared by all bindings to the collection, which causes all direct bindings to the collection to share the sort, filter, group, and current item characteristics of the one default view.

所以看起来当您告诉 DataGrid 使用源时,它仍然自动采用(默认)视图,该视图在所有绑定上共享并应用了您的过滤器。

编辑:

它还说

This default view is never affiliated with any CollectionViewSource objects.

因此,如果您将过滤器应用到 new CollectionViewSource(mySources)View 而不是默认视图,它就不会过滤。

I should have bound the view to the DataGrid, not the source, right?

是的。 CollectionView 是您的集合和 DataGrid 之间的层。它允许您对集合中的项目进行导航、排序、过滤和分组 ,而无需实际修改原始集合。所以行 DataGrid.ItemsSource = mySources; 是错误的,你应该将它绑定到 myView 而不是。

The elements that don't match with my filter are removed from the CollectionView and from the UI, but my source list is unchanged...

如果您的目标是从 CollectionView 中获取过滤项目列表,您应该使用 Cast 扩展方法:

var filteredData = myView.Cast<Entity>()