2010-06-20 5 views
2

J'ai le champ ObservableCollection<ViewUnit> _myItems, où ViewUnit implémente INotifyPropertyChanged.ObservableCollection découper en utilisant lambda

ViewUnit possède la propriété Handled : bool.

La vue principale de l'application WPF a un ListBox qui se lie à _myItems.

Je veux une vue séparée des éléments non manipulés seulement, c'est-à-dire, avoir un IObservableCollection<> dépendait du _myItems existant mais ayant seulement des éléments filtrés, de préférence, en utilisant une expression lambda.

Idéalement, ce serait

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

je pourrais le mettre en œuvre sur le mien. Je sens juste quelqu'un par l'intermédiaire de ce problème et j'ai une bonne solution disponible (je ne connais tout simplement pas son nom).

Répondre

4

Jetez un oeil à CollectionView. C'est une vue autour d'une collection qui gère le filtrage, le groupement et le tri. Lorsque vous demandez à WPF de se lier à une collection, il se lie en fait à son point de vue par défaut, de sorte que vous pouvez simplement filtrer l'affichage de collection par défaut comme ceci:

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

Le filtre est un prédicat sur object, de sorte que vous devrez Transmettez le paramètre à ViewUnit. Il ne sera également pas notifié si la propriété change, vous devrez donc appeler collectionView.Refresh si la propriété Handled change. Il sera mis à jour si vous ajoutez ou supprimez de _myItems, cependant.

Consultez aussi le billet de Bea Stollnitz How do I filter items from a collection.

+0

Il est important de noter qu'un objet CollectionView créé à partir d'un ObservableCollection déclenche des événements correctement. C'est une force vraiment significative. –

Questions connexes