80 votes

Devrais-je me lier à ICollectionView ou ObservableCollection

Faut-il lier DataGrid à la

ICollectionView = CollectionViewSource.GetDefaultView(collection)

ou à la

ObservableCollection<T> collection; ???

Quelle est la meilleure pratique pour MVVM et pourquoi?

124voto

Jon Points 194296

Vous avez toujours lier à un ICollectionView, si vous la rendre explicite ou non.

Supposons que nous avons

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

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

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

Juste pour être totalement clair: même si vous liez à la collecte directe, le moteur de liaison va se lier à la vue par défaut. La modification des propriétés de la vue tels que les critères de tri va affecter la liaison qui semble lier directement à la collecte, puisque derrière les couvertures c'est une liaison à la vue par défaut à la place.

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

Considérant que chaque point de vue a sa propre notion de l'élément en cours, les critères de tri, etc, il en résulte que, si vous avez l'intention d'avoir plusieurs liaisons vers la même collection, et les contrôles liés besoin d'avoir des notions distinctes de l'élément en cours, des filtres et de l'entreprise, alors ce que vous voulez est explicitement lier à plusieurs vues de la même collection sous-jacente.

34voto

Jimmie R. Houts Points 3761

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

ICollectionView vous donnera la possibilité de filtrer, trier ou de groupe de la collecte en plus de propogating INotifyCollectionChanged des événements si la collection sous-jacente qu'il implémente.

Tapez fonctionne bien avec MVVM aussi longtemps que vous lier à elle. Utiliser ICollectionView quand vous avez besoin le tri, le filtrage, ou de regroupement. Utiliser ObservableCollection<T> directement lorsque vous n'en avez pas.

9voto

Euphoric Points 7641

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. Beaucoup de puristes de 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émentera, mais ne fait pas partie de WPF elle-même.

7voto

Haris Hasan Points 17497

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

2voto

devdigital Points 22495

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X