Sollte man sich DataGrid
an die binden
ICollectionView = CollectionViewSource.GetDefaultView(collection)
oder zum
ObservableCollection<T> collection;
???
Was ist die beste Vorgehensweise für MVVM und warum?
Sollte man sich DataGrid
an die binden
ICollectionView = CollectionViewSource.GetDefaultView(collection)
oder zum
ObservableCollection<T> collection;
???
Was ist die beste Vorgehensweise für MVVM und warum?
Antworten:
Sie binden immer an ein ICollectionView
, ob Sie es explizit machen oder nicht.
Angenommen, wir haben
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
In diesem Fall ist die Bindung an collection
oder an collectionView
ein und dieselbe: Die Bindungs-Engine bindet an die Standardauflistungsansicht (deren Referenz gleich ist collectionView
), wenn Sie sie anweisen, an zu binden collection
.
Dies bedeutet, dass die Antwort auf Ihre Frage lautet "es macht absolut keinen Unterschied".
Um ganz klar zu sein: Selbst wenn Sie direkt an die Sammlung binden, wird die Bindungs-Engine an die Standardansicht gebunden. Das Ändern von Eigenschaften der Ansicht, z. B. Sortierkriterien, wirkt sich auf die Bindung aus, die anscheinend direkt an die Sammlung gebunden ist, da hinter den Deckblättern stattdessen eine Bindung an die Standardansicht erfolgt.
Es gibt jedoch noch eine andere interessante und verwandte Frage: Sollte man sich an die Standardauflistungsansicht (dh an die Auflistung selbst, da es keinen Grund gibt, explizit an die Standardansicht zu binden) oder an eine andere Ansicht derselben Auflistung binden?
In Anbetracht der Tatsache, dass jede Ansicht ihre eigene Vorstellung von aktuellem Element, Sortierkriterien usw. hat, folgt daraus, dass, wenn Sie mehrere Bindungen an dieselbe Sammlung haben möchten und die gebundenen Steuerelemente unterschiedliche Vorstellungen von aktuellem Element, Filtern und Unternehmen haben müssen Sie möchten explizit an mehrere Ansichten derselben zugrunde liegenden Sammlung binden.
ObservableCollection<T>
implementiert INotifyCollectionChanged
und benachrichtigt die Benutzeroberfläche, wenn die Elemente in der Sammlung geändert wurden.
ICollectionView
bietet Ihnen die Möglichkeit, die Sammlung zu filtern, zu sortieren oder zu gruppieren und INotifyCollectionChanged
Ereignisse zu propagieren , wenn die zugrunde liegende Sammlung sie implementiert.
Beide Typen funktionieren gut mit MVVM, solange Sie daran binden. Verwenden ICollectionView
Sie diese Option, wenn Sie sortieren, filtern oder gruppieren müssen. Verwenden Sie ObservableCollection<T>
direkt, wenn Sie nicht.
Nur um zu dem hinzuzufügen, was Jon gesagt hat. Der Hauptunterschied besteht darin, dass CollectionViewSource.GetDefaultView(collection)
Sie mit ViewModel von WPF abhängig machen. Viele MVVM-Puristen mögen dies nicht und dies würde ObservableCollection nur als gültige Option belassen.
Eine andere Möglichkeit wäre, ICollectionView
eine Klasse zu verwenden, die sie implementiert, aber nicht Teil von WPF selbst ist.
Ich denke nicht, dass es irgendetwas mit sich MVVM
selbst zu tun hat. ICollectionView
bietet zusätzliche Funktionen wie Soring Grouping usw., falls Sie diese benötigen, verwenden Sie sie IColectionView
einfachObservableCollection
Sie würden an die Ansicht binden, wenn Ihr Raster die auf die Ansicht angewendeten Einstellungen anzeigen soll, z. B. Filtern, andernfalls ist die Ansicht redundant.