Sollte man DataGrid
an das binden?
ICollectionView = CollectionViewSource.GetDefaultView(collection)
oder zum
ObservableCollection<T> collection;
???
Was ist die beste Vorgehensweise für MVVM und warum?
Sie binden immer an ein ICollectionView
, unabhängig davon, ob Sie es explizit angeben 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 dasselbe: Die Bindungsengine bindet an die Standardsammlungsansicht (die auf collectionView
verweist), wenn Sie sagen, es soll an collection
gebunden werden.
Dies bedeutet, dass die Antwort auf Ihre Frage "es macht absolut keinen Unterschied" ist.
Um ganz klar zu sein: Auch wenn Sie direkt an die Sammlung binden, wird die Bindungsengine an die Standardansicht gebunden. Das Ändern von Eigenschaften der Ansicht wie Sortierkriterien wirkt sich auf die Bindung aus, die anscheinend direkt an die Sammlung gebunden ist, da sich hinter den Deckblättern eine Bindung an die Standardansicht befindet.
Es gibt jedoch eine andere interessante und verwandte Frage: Soll man sich an die Standardsammlungsansicht (d. H. An die Sammlung selbst, da es keinen Grund gibt, sich explizit an die Standardansicht zu binden) oder an eine andere Ansicht derselben Sammlung binden?
Unter Berücksichtigung der Tatsache, dass jede Ansicht einen eigenen Begriff für das aktuelle Element, Sortierkriterien usw. hat, folgt daraus, dass, wenn Sie mehrere Bindungen für dieselbe Sammlung haben möchten, die gebundenen Steuerelemente unterschiedliche Begriffe für das aktuelle Element, Filter und Unternehmen haben müssen Sie möchten sich 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
gibt Ihnen die Möglichkeit, die Sammlung zu filtern, zu sortieren oder zu gruppieren und INotifyCollectionChanged
Ereignisse zu propagieren, wenn die zugrunde liegende Sammlung dies implementiert.
Beide Typen funktionieren gut mit MVVM, solange Sie daran binden. Verwenden Sie ICollectionView
, wenn Sie sortieren, filtern oder gruppieren möchten. Verwenden ObservableCollection<T>
direkt wenn du nicht.
Nur um hinzuzufügen, was Jon gesagt hat. Der Hauptunterschied besteht darin, dass Sie mit CollectionViewSource.GetDefaultView(collection)
ViewModel von WPF abhängig machen. Viele MVVM-Puristen mögen dies nicht und dies würde ObservableCollection als einzige gültige Option belassen.
Eine andere Möglichkeit wäre, ICollectionView
zu verwenden und eine Klasse zu verwenden, die diese implementiert, aber nicht Teil von WPF selbst ist.
Ich glaube nicht, dass es irgendetwas mit MVVM
selbst zu tun hat. ICollectionView
bietet zusätzliche Funktionen wie das Speichern von Gruppen usw. Wenn Sie diese benötigen, verwenden Sie IColectionView
. Andernfalls verwenden Sie einfach ObservableCollection
.
Sie würden an die Ansicht binden, wenn Ihr Raster die auf die Ansicht angewendeten Einstellungen anzeigen soll, z. Filterung, sonst ist die Ansicht überflüssig.