2010-06-20 47 views
2

我有ObservableCollection<ViewUnit> _myItems字段,其​​中ViewUnit實現INotifyPropertyChanged使用lambda的ObservableCollection分片

ViewUnitHandled : bool財產。

WPF應用程序的主視圖有一個ListBox,它綁定到_myItems

我只想要一個單獨的未處理項目視圖,也就是說IObservableCollection<>依賴於現有的_myItems,但只有過濾項目,最好使用lambda表達式。

理想的情況下,這將是

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

我可以實現它在我自己的。我只是覺得有人通過這個問題,並有一個很好的解決方案(我只是不知道它的名字)。

回答

4

看看CollectionView。這是圍繞處理過濾,分組和排序的集合的視圖。當你問WPF綁定到它真正結合到其默認視圖的集合,所以你可以篩選這樣的默認集合視圖:上object

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

過濾器是一個謂語,所以你必須要將參數投射到ViewUnit。如果物業發生變化,也不會通知您,因此如果Handled物業發生變化,您需要致電collectionView.Refresh。但是,如果您添加或從_myItems中刪除,它將被更新。

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

+0

請務必注意,從ObservableCollection創建的CollectionView會正確引發事件。這是一個非常重要的優勢。 – 2010-06-21 02:09:16