使用lambda进行ObservableCollection切片

时间:2010-06-20 19:32:30

标签: .net wpf data-binding lambda observablecollection

我有ObservableCollection<ViewUnit> _myItems字段,其中ViewUnit实现了INotifyPropertyChanged

ViewUnitHandled : bool属性。

WPF应用程序的主视图有ListBox,绑定到_myItems

我只想要一个单独的非处理项视图,也就是说,IObservableCollection<>依赖于现有的_myItems但只有过滤的项目,最好是使用lambda表达式。

理想情况下,这将是

IObservableCollection<ViewUnit> _myFilteredCollection = HelperClass<ViewUnit>.FromExisting(_myItems, (e) => !e.Handled);

我可以自己实施。我只是觉得有人通过这个问题而且有一个很好的解决方案(我只是不知道它的名字)。

1 个答案:

答案 0 :(得分:4)

看看CollectionView。这是一个处理过滤,分组和排序的集合的视图。当你要求WPF绑定到一个集合时,它实际上绑定到它的默认视图,所以你可以像这样过滤默认的集合视图:

var collectionView = CollectionViewSource.GetDefaultView(_myItems);
collectionView.Filter = e => !((ViewUnit)e).Handled;

过滤器是object的谓词,因此您必须将参数强制转换为ViewUnit。如果属性发生更改,也不会通知它,因此如果collectionView.Refresh属性发生更改,您将需要调用Handled。但是,如果您在_myItems中添加或删除,它将会更新。

另请查看Bea Stollnitz的博客文章How do I filter items from a collection