我有 ObservableCollection<ViewUnit> _myItems
字段,其中 ViewUnit
实现 INotifyPropertyChanged
。ViewUnit
具有 Handled : bool
属性。
WPF 应用程序的主 View 有一个 ListBox
绑定(bind)到 _myItems
。
我只想要非处理项目的单独 View ,也就是说,IObservableCollection<>
依赖于现有的 _myItems
但只有过滤项目,最好使用 lambda 表达式。
理想情况下,这将是
IObservableCollection<ViewUnit> _myFilteredCollection = HelperClass<ViewUnit>.FromExisting(_myItems, (e) => !e.Handled);
我可以自己实现它。我只是觉得有人解决了这个问题并且有一个很好的解决方案(我只是不知道它的名字)。
最佳答案
看看 CollectionView 。这是一个围绕处理过滤、分组和排序的集合的 View 。当您要求 WPF 绑定(bind)到一个集合时,它实际上绑定(bind)到其默认 View ,因此您可以像这样过滤默认集合 View :
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 。
关于.net - ObservableCollection 使用 lambda 切片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3080658/