Должен ли я связать с ICollectionView или ObservableCollection
Если связать DataGrid
к
ICollectionView = CollectionViewSource.GetDefaultView(collection)
или к
ObservableCollection<T> collection;
???
Какова лучшая практика для MVVM и почему?
5 ответов
Вы всегда привязаны к ICollectionView
Вы делаете это явно или нет.
Предположим, что у нас есть
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
В этом случае, привязка к collection
или collectionView
одно и то же: механизм привязки будет привязан к представлению коллекции по умолчанию (ссылка на который равна collectionView
) если вы скажете это, чтобы связать с collection
,
Это означает, что ответ на ваш вопрос "это не имеет абсолютно никакого значения".
Просто для полной ясности: даже если вы привязываете к коллекции напрямую, механизм привязки будет привязываться к представлению по умолчанию. Изменение свойств представления, таких как критерии сортировки, повлияет на привязку, которая, по-видимому, привязывается непосредственно к коллекции, поскольку вместо обложек это привязка к представлению по умолчанию.
Однако есть еще один интересный и связанный с этим вопрос: следует ли связывать с представлением коллекции по умолчанию (т. Е. С самой коллекцией, поскольку нет причин явно связывать с представлением по умолчанию) или с другим представлением той же коллекции?
Учитывая, что у каждого представления есть свое собственное понятие текущего элемента, критериев сортировки и т. Д., Из этого следует, что если вы намереваетесь иметь несколько привязок к одной и той же коллекции, а связанные элементы управления должны иметь различные понятия текущего элемента, фильтров и компании, тогда вам нужно явно привязать несколько представлений к одной и той же коллекции.
ObservableCollection<T>
инвентарь INotifyCollectionChanged
и уведомит пользовательский интерфейс, когда элементы в коллекции были изменены.
ICollectionView
даст вам возможность фильтровать, сортировать или группировать коллекцию в дополнение к распространению INotifyCollectionChanged
события, если базовая коллекция реализует его.
Любой тип хорошо работает с MVVM, если вы привязаны к нему. использование ICollectionView
когда вам нужна сортировка, фильтрация или группировка. использование ObservableCollection<T>
непосредственно, когда вы этого не сделаете.
Просто чтобы добавить к тому, что сказал Джон. Основное отличие состоит в том, что при использовании CollectionViewSource.GetDefaultView(collection)
вы делаете вашу ViewModel зависимой от WPF. Многим пуристам MVVM это не нравится, и из-за этого ObservableCollection остается только допустимой опцией.
Другой вариант будет использовать ICollectionView
и использовать класс, который его реализует, но не является частью самого WPF.
Я не думаю, что это связано с MVVM
сам. ICollectionView
предоставляет дополнительные функции, такие как хранение групп и т. д., если вам нужно их использовать IColectionView
в противном случае просто используйте ObservableCollection
Вы привязываетесь к представлению, если хотите, чтобы в вашей сетке отображались параметры, примененные к представлению, например фильтрация, в противном случае представление является избыточным.