Faut-il lier DataGrid
à la
ICollectionView = CollectionViewSource.GetDefaultView(collection)
ou au
ObservableCollection<T> collection;
???
Quelle est la meilleure pratique pour MVVM et pourquoi?
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.
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.
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.
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
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.