WPF错误绑定但CollectionView仍在过滤

时间:2016-12-22 10:23:59

标签: c# wpf datagrid collectionviewsource

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

这是我做的:

  1. 获取源项目(来自数据库)
  2. 从中创建ICollectionView
  3. 设置我的自定义过滤器
  4. 来源绑定到DataGrid而不是视图
  5. 第四点是我弄错了。我应该将视图绑定到DataGrid,而不是,对吧?

    以下是代码:

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

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

    myView.Refresh();
    

    它的工作原理......与我的过滤器不匹配的元素将从CollectionView和UI中删除,但我的源列表未更改...

    有人可以解释一下这是如何起作用的吗?

2 个答案:

答案 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>()