web-dev-qa-db-fra.com

Dois-je me lier à ICollectionView ou ObservableCollection

Faut-il lier DataGrid à la

ICollectionView = CollectionViewSource.GetDefaultView(collection)

ou au

ObservableCollection<T> collection; ???

Quelle est la meilleure pratique pour MVVM et pourquoi?

79
Cartesius00

Vous toujours vous liez à un ICollectionView, que vous le rendiez explicite ou non.

Supposons que nous avons

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

Dans ce cas, la liaison à collection ou à collectionView est la même: le moteur de liaison se liera à la vue de collection par défaut (qui est une référence égale à collectionView) si vous lui dites de se lier à collection.

Cela signifie que la réponse à votre question est "cela ne fait absolument aucune différence".

Pour être tout à fait clair: même si vous vous liez directement à la collection, le moteur de liaison se liera à la vue par défaut. La modification des propriétés de la vue, telles que les critères de tri, affectera la liaison qui semble se lier directement à la collection, car derrière les couvertures, c'est une liaison à la vue par défaut.

Cependant, il existe une autre question intéressante et connexe: doit-on se lier à la vue de collection par défaut (c'est-à-dire à la collection elle-même, car il n'y a aucune raison de se lier explicitement à la vue par défaut) ou à une autre vue de la même collection?

Étant donné que chaque vue a sa propre notion d'élément actuel, de critères de tri, etc., il s'ensuit que si vous avez l'intention d'avoir plusieurs liaisons vers la même collection et que les contrôles liés doivent avoir des notions distinctes d'élément actuel, de filtres et de société, alors ce que vous voulez, c'est vous lier explicitement à plusieurs vues de la même collection sous-jacente.

122
Jon

ObservableCollection<T> implémente INotifyCollectionChanged et avertira l'interface utilisateur lorsque les éléments de la collection ont été modifiés.

ICollectionView vous donnera la possibilité de filtrer, trier ou grouper la collection en plus de propager les événements INotifyCollectionChanged si la collection sous-jacente l'implémente.

Les deux types fonctionnent bien avec MVVM tant que vous vous y connectez. Utilisez ICollectionView lorsque vous avez besoin de trier, de filtrer ou de regrouper. Utilisation ObservableCollection<T> directement quand vous ne le faites pas.

32
Jimmie R. Houts

Juste pour ajouter à ce que Jon a dit. La principale différence est qu'en utilisant CollectionViewSource.GetDefaultView(collection), vous rendez ViewModel dépendant de WPF. De nombreux puristes MVVM n'aiment pas cela et cela ne laisserait à ObservableCollection qu'une option valide.

Une autre option serait d'utiliser ICollectionView et d'utiliser une classe, qui l'implémente, mais ne fait pas partie de WPF lui-même.

9
Euphoric

Je ne pense pas que cela doive faire quoi que ce soit avec MVVM lui-même. ICollectionView fournit des fonctionnalités supplémentaires telles que le regroupement des sorks, etc. si vous en avez besoin, utilisez IColectionView sinon utilisez simplement ObservableCollection

7
Haris Hasan

Vous vous lieriez à la vue si vous souhaitez que votre grille affiche les paramètres appliqués à la vue, par ex. filtrage, sinon la vue est redondante.

2
devdigital