Jeśli należy połączyć DataGridsię z
ICollectionView = CollectionViewSource.GetDefaultView(collection)
lub do
ObservableCollection<T> collection; ???
Jaka jest najlepsza praktyka dla MVVM i dlaczego?
Jeśli należy połączyć DataGridsię 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 collectionlub do collectionViewjest 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 INotifyCollectionChangedi powiadomi interfejs użytkownika, gdy elementy w kolekcji zostaną zmienione.
ICollectionViewdaje możliwość filtrowania, sortowania lub grupowania kolekcji oprócz propagowania INotifyCollectionChangedzdarzeń, jeśli bazowa kolekcja ją implementuje.
Każdy typ działa dobrze z MVVM, o ile się z nim powiążesz. Użyj, ICollectionViewgdy 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 ICollectionViewi 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 MVVMsobą. ICollectionViewzapewnia dodatkowe funkcje, takie jak grupowanie sortowania itp., Jeśli potrzebujesz, IColectionViewpo 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.