使用CollectionView过滤DataTable时出现错误的原因?

标题为。

所以我成功地使用以下方法将DataTable放入我的CollectionView

  ICollectionView _collectionView { get; set; } public ICollectionView collectionView {......} DataTable myDataTable= new DataTable(); myConnection.Open(); dbAdpater.Fill(myDataTable); myConnection.Close(); var collectionList= (newLeadTable as IListSource).GetList(); this.collectionView = CollectionViewSource.GetDefaultView(collectionList); 

我知道列表中的每个对象都是DataRowView ,并且我通过迭代数据测试,我可以看到正确存储。

执行代码时, DataGrid正确显示。

但是一旦我添加了Filter:

  this.collectionView.Filter = new Predicate( (obj) => { return false; //Just for testing propose } ); 

当我执行代码时给我错误:

无法创建程序集“TestWPF,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”中定义的“Window1”实例。 调用的目标抛出了exception。 标记文件’TestWPF; component / Window1.xaml’中的错误第1行位置9。

并输出:

PresentationFramework.dll中出现“System.NotSupportedException”类型的第一次机会exception

我还尝试将DataTable存储转换为custom object列表以进行过滤,但工作正常。

所以我想知道在使用DataTable过滤时我做错了什么?

请参阅http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections

为了提高性能,ADO.NET DataTable或DataView对象的集合视图将排序和过滤委托给DataView。

BindingListCollectionView不支持过滤。 相反,您必须使用CustomFilter属性,该属性接受filter字符串并将其用作基础DataView.RowFilter属性的值。 字符串值是您将用于在SELECT查询中构造WHERE子句的SQL。

 this.collectionView.CustomFilter = "Price > 20"; 

如果要使用多个条件,则必须将它们与AND或OR串在一起(就像SQL一样)。