我有ObservableCollection<ViewUnit> _myItems
字段,其中ViewUnit
实现了INotifyPropertyChanged
。
ViewUnit
有Handled : bool
属性。
WPF应用程序的主视图有ListBox
,绑定到_myItems
。
我只想要一个单独的非处理项视图,也就是说,IObservableCollection<>
依赖于现有的_myItems
但只有过滤的项目,最好是使用lambda表达式。
理想情况下,这将是
IObservableCollection<ViewUnit> _myFilteredCollection = HelperClass<ViewUnit>.FromExisting(_myItems, (e) => !e.Handled);
我可以自己实施。我只是觉得有人通过这个问题而且有一个很好的解决方案(我只是不知道它的名字)。
答案 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。