我有 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/

10-11 02:44