2010-06-18 10 views
4

J'ai deux ObservableCollections, disons ObservableCollection<Cat> et ObservableCollections<Dog>. Chat et Chien dérivent tous deux de la classe Pet. Je veux afficher une liste de tous les animaux domestiques. Comment puis-je faire cela? Je préfère ne pas créer un nouveau ObservableCollection<Pet> en ajoutant des éléments des deux listes de sources car cette liste deviendra obsolète à mesure que d'autres chats et chiens seront ajoutés aux listes de sources. Je peux penser à deux approches:Comment afficher deux ObservableCollections sous forme de liste unique dans WPF?

1) Créez un "Décorateur" ObservableCollection qui garde les deux collections sources en tant que membres et les itère à chaque fois.

2) Créer un ObservableCollection<Pet> qui possède les éléments combinés des deux collections sources, mais qui dépend également des collections sources. Ainsi, si un chat est ajouté à la collection Cat, cette collection est notifiée et il ajoute le nouveau Chat à lui-même.

Existe-t-il un moyen standard pour résoudre ce problème? Je ne veux pas réinventer la roue!

Répondre

7

Utilisez un CompositeCollection pour agréger plusieurs collections et éléments avec la prise en charge complète des modifications de collection.

Modifier: CompositeCollection n'est pas un objet de dépendance, donc il n'y a pas de notion de contexte de données, d'où la raison pour laquelle la liaison ne fonctionne pas. Vous devez créer la collection à partir du code si vous ajoutez des éléments liés ou des collections.

+1

Excellent! Exactement ce que je cherchais. Merci. – Naresh

+0

Eh bien, j'ai essayé de faire fonctionner CompositeCollection pendant quelques heures maintenant, mais je n'arrive pas à le faire fonctionner. Je spécifie comme le ItemSource à mon ComboBox comme ceci (Cats est un ObservableCollection dans mon ViewModel): Mais je reçois cette erreur: Impossible de trouver la règle FrameworkElement ou FrameworkContentElement pour l'élément cible. BindingExpression: Path = Cats; DataItem = null; Si je supprime complètement le CompositeCollection et que je le lie directement à ObservableCollection, tout fonctionne. Des indices? – Naresh

+0

La réponse ici montre comment lier CompositeCollection à partir de XAML: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Govert