2009-06-11 7 views
36

Ich entwickle eine WPF-Anwendung mit dem MVVM-Muster und ich muss eine Liste von Elementen in einer ListView anzeigen (mit Filterung), mit den Feldern des ausgewählten Elements in einer Master/Detailansicht angezeigt. Ich bin hin- und hergerissen zwischen den folgenden zwei Möglichkeiten, dies zu tun:MVVM: CollectionView in ViewModel oder CollectionViewSource in XAML?

  1. Eine CollectionView in meinem ViewModel exponieren und an diese binden.
  2. Ein einfaches IList in meinem ViewModel anzeigen und mithilfe von CollectionViewSource das CollectionView in XAML erstellen.

Gibt es einen akzeptierten Weg, dies zu tun? Irgendwelche Gedanken über den besten Weg?

+1

Es ist erstaunlich, dass Sie oft feststellen, dass jemand genau die gleiche Frage gestellt hat, die Sie stellen wollten. Vielen Dank! :) –

Antwort

30

Ich mache das ehemalige (aussetzen CollectionView von der VM), aber was wirklich wichtig ist, ist, wo Ihre Filterlogik ist. Das sollte definitiv in der VM sein, damit es getestet werden kann, auch wenn die View die CollectionViewSource an die VM verdrahten muss. Nichtsdestotrotz denke ich, dass es nichts besonders Gemeines oder Anti-MVVM gibt, wenn Sie eine CollectionView von Ihrer VM aus offenlegen.

+0

Erstellen Sie einfach eine neue CollectionView im ViewModel? MSDN for CollectionView besagt, dass Sie keine neue CollectionView erstellen, sondern stattdessen eine CollectionViewSource erstellen und die Standardansicht abrufen sollten. Was ist der beste Weg, um ein CollectionView zu erstellen? –

+0

MSDN ist nicht genau über den besten Weg, es in Code zu tun. Ich erstelle nur die CollectionView-Unterklasse direkt (zB ListCollectionView), aber ich nehme an, Sie könnten auch CollectionViewSource verwenden. Mein Verständnis ist, dass CVS nur die Auswahl der passenden CV-Unterklasse für Sie vornimmt und XAML-Unterstützung bietet. Ich hatte keine Probleme, den Lebenslauf selbst zu erstellen, und es scheint sinnvoll, wenn Sie es in Code tun und bereits den Typ der Sammlung kennen, die Sie verpacken. –

+0

Vergessen Sie nicht, dass WPF beim Binden automatisch Ansichten für Sie erstellt ... Sie erhalten eine ListCollectionView, wenn Sie beispielsweise an IList binden. Dies hat bereits eine Menge Sortier-/Filter-/Gruppierungsfunktionen, hängt jedoch davon ab, dass Sie die Items-Auflistung des Objekts erhalten, an das Sie binden. Stattdessen können Sie var view = CollectionViewSource.GetDefaultView (IhreCollection) als ListCollectionView verwenden. Du kannst dann alle möglichen coolen Sachen machen. – Stimul8d

3

Ich weiß, ich bin ein bisschen spät dran, Ihre Frage zu beantworten, aber ich habe es heute gesehen.

Ich habe Master/Detail Viewmodels erstellt, die die CollectionViewSource verwenden und darüber gebloggt haben.

schrieb ich über ein Ansichtsmodell für Master/Detail-Tabellen hier, die verwendet: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

Sie können auch ein Ansichtsmodell für die ObservableCollection-Klasse auf meinen Blog-Seiten.

Vielleicht finden Sie es von Nutzen für Sie.

Verwandte Themen