webentwicklung-frage-antwort-db.com.de

Soll ich mich an ICollectionView oder ObservableCollection binden?

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?

79
Cartesius00

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.

122
Jon

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.

32
Jimmie R. Houts

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.

9
Euphoric

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.

7
Haris Hasan

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.

2
devdigital