2010-06-20 2 views
2

У меня ObservableCollection<ViewUnit> _myItems поле, где ViewUnit осуществляет INotifyPropertyChanged.ObservableCollection slicing using lambda

ViewUnit имеет Handled : bool Недвижимость.

Основной вид приложения WPF имеет ListBox, который связывается с _myItems.

Я хочу, чтобы отдельный вид предметов без обработки, то есть для того, чтобы иметь IObservableCollection<>, зависел от существующих _myItems, но имел только отфильтрованные элементы, предпочтительно с использованием лямбда-выражения.

В идеале, это будет

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

я мог бы осуществить это самостоятельно. Я просто чувствую кого-то, несмотря на эту проблему, и имеет хорошее решение (я просто не знаю его имени).

ответ

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.

+0

Важно отметить, что CollectionView, созданный из ObservableCollection, вызывает события должным образом. Это действительно значительная сила. –