CollectionViewSource,如何过​​滤数据?

我将ComboBox绑定到实体,但我希望过滤数据。

到目前为止,我尝试了两种方法:

  • “简单”一:通过LINQ to Entities将filter直接应用于ObjectSet
  • 设置过滤事件处理程序,如msdn所述

我对第一种方法感到满意,首先是因为生成到数据库的查询包含WHERE子句,所以不是所有的数据都必须从远程数据库中检索….

但是,#2方法更灵活,如果在运行时我想更改应用的过滤…我已经按照msdn上的示例,但我得到一个例外,为什么?

所以,我的问题是:
1.哪种方法更好
2.为什么我得到例外?

这是我的代码:

private void UserControl_Loaded(object sender, RoutedEventArgs e) { //Do not load your data at design time. if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { //Load your data here and assign the result to the CollectionViewSource. System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource) this.Resources["tSCHEDEViewSource"]; // If I use this I get the data filtered on startup, but is it the right mode? //myCollectionViewSource.Source = _context.TSCHEDE.Where(s => s.KLINEA == kLinea && s.FCANC == "T").OrderBy(s => s.DSCHEDA).OrderByDescending(s => s.DSTORICO); // Instead If I apply my custom filtering logic myCollectionViewSource.Filter += new FilterEventHandler(filterSource); myCollectionViewSource.Source = _context.TSCHEDE; // ... Here i get an exception: // 'System.Windows.Data.BindingListCollectionView' view does not support filtering. ??? } } private void filterSource(object sender, FilterEventArgs e) { TSCHEDE scheda = e.Item as TSCHEDE; if (scheda != null) { if (scheda.KLINEA == 990) { e.Accepted = true; } else { e.Accepted = false; } } } 

编辑 :我已经尝试在View上实现Filter属性而不是设置EventHandler:

 myCollectionView = (BindingListCollectionView)myCollectionViewSource.View; myCollectionView.Filter = new Predicate(Contains); public bool Contains(object de) { TSCHEDE scheda = de as TSCHEDE; return (scheda.KLINEA == 990); } 

现在我得到了不太有用的例外:

System.NotSupportedException:不支持指定的方法。 在System.Windows.Data.CollectionView.set_Filter(Predicate`1值)

编辑

XAML代码:

                      

现在我认为问题出在XAML Binding中,而不是代码背后……

检查一下

1) CollectionView过滤

过滤需要基于filter将发生的委托(谓词)。 谓词根据返回的值true或false接收项目,它选择或取消选择元素。

 this.Source.Filter = item => { ViewItem vitem = item as ViewItem; return vItem != null && vitem.Name.Contains("A"); }; 

2) 动态地处理数据

最后我找到了一个解决方案, 在此问题中也发布了expliticy来声明Collection的类型:

CollectionViewType = “的ListCollectionView”

所以在XAML中添加了Collection类型:

   

现在代码中的事件处理程序工作:

 myCollectionViewSource.Filter += new FilterEventHandler(filterSource); 

唯一遗憾的是,我不明白为什么,因为显然如此简单,我必须在XAML中“手动”强制它? 对我来说,这似乎是一个黑客,也很容易出错……