【问题标题】:ObservableCollection slicing using lambda使用 lambda 进行 ObservableCollection 切片
【发布时间】:2011-03-06 01:42:44
【问题描述】:

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

ViewUnit 具有 Handled : bool 属性。

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

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

理想情况下,这是

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

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

【问题讨论】:

    标签: .net wpf data-binding lambda observablecollection


    【解决方案1】:

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

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

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

    还可以查看 Bea Stollnitz 的博客条目 How do I filter items from a collection

    【讨论】:

    • 请务必注意,从 ObservableCollection 创建的 CollectionView 会正确引发事件。这是一个非常重要的力量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多