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