Jeśli należy połączyć DataGrid
się z
ICollectionView = CollectionViewSource.GetDefaultView(collection)
lub do
ObservableCollection<T> collection;
???
Jaka jest najlepsza praktyka dla MVVM i dlaczego?
Jeśli należy połączyć DataGrid
się z
ICollectionView = CollectionViewSource.GetDefaultView(collection)
lub do
ObservableCollection<T> collection;
???
Jaka jest najlepsza praktyka dla MVVM i dlaczego?
Odpowiedzi:
Ty zawsze wiążą się z ICollectionView
, czy zrobić to jawne czy nie.
Załóżmy, że mamy
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
W tym przypadku powiązanie z collection
lub do collectionView
jest jednym i tym samym: silnik powiązań będzie wiązał się z domyślnym widokiem kolekcji (który jest równy referencji collectionView
), jeśli powiesz mu, aby się z nim wiązał collection
.
Oznacza to, że odpowiedź na Twoje pytanie brzmi: „to absolutnie nie ma znaczenia”.
Dla jasności: nawet jeśli utworzysz powiązanie bezpośrednio z kolekcją, silnik powiązań połączy się z widokiem domyślnym. Modyfikowanie właściwości widoku, takich jak kryteria sortowania, wpłynie na powiązanie, które wydaje się wiązać bezpośrednio z kolekcją, ponieważ za okładkami jest to powiązanie z widokiem domyślnym.
Jest jednak inne interesujące i powiązane pytanie: czy należy wiązać się z domyślnym widokiem kolekcji (tj. Z samą kolekcją, ponieważ nie ma powodu, aby jawnie wiązać się z widokiem domyślnym), czy z innym widokiem tej samej kolekcji?
Biorąc pod uwagę, że każdy widok ma własne pojęcie o bieżącym elemencie, kryteriach sortowania itp., Wynika z tego, że jeśli zamierzasz mieć wiele powiązań z tą samą kolekcją, a powiązane kontrolki muszą mieć odrębne pojęcia dotyczące bieżącego elementu, filtrów i firmy, to chcesz jawnie powiązać wiele widoków tej samej podstawowej kolekcji.
ObservableCollection<T>
implementuje INotifyCollectionChanged
i powiadomi interfejs użytkownika, gdy elementy w kolekcji zostaną zmienione.
ICollectionView
daje możliwość filtrowania, sortowania lub grupowania kolekcji oprócz propagowania INotifyCollectionChanged
zdarzeń, jeśli bazowa kolekcja ją implementuje.
Każdy typ działa dobrze z MVVM, o ile się z nim powiążesz. Użyj, ICollectionView
gdy potrzebujesz sortowania, filtrowania lub grupowania. Używaj ObservableCollection<T>
bezpośrednio, gdy nie masz.
Wystarczy dodać do tego, co powiedział Jon. Główną różnicą jest to, że używając CollectionViewSource.GetDefaultView(collection)
, uzależniasz ViewModel od WPF. Wielu purystów MVVM nie lubi tego, a to pozostawiłoby ObservableCollection tylko prawidłową opcję.
Inną opcją byłoby użycie ICollectionView
i użycie klasy, która ją implementuje, ale nie jest częścią samego WPF.
Nie sądzę, żeby to miało coś wspólnego ze MVVM
sobą. ICollectionView
zapewnia dodatkowe funkcje, takie jak grupowanie sortowania itp., Jeśli potrzebujesz, IColectionView
po prostu użyjObservableCollection
Powiążesz się z widokiem, jeśli chcesz, aby Twoja siatka wyświetlała ustawienia zastosowane do widoku, np. Filtrowanie, w przeciwnym razie widok jest zbędny.