Если привязаться DataGrid
к
ICollectionView = CollectionViewSource.GetDefaultView(collection)
или в
ObservableCollection<T> collection;
???
Какая лучшая практика для MVVM и почему?
Если привязаться DataGrid
к
ICollectionView = CollectionViewSource.GetDefaultView(collection)
или в
ObservableCollection<T> collection;
???
Какая лучшая практика для MVVM и почему?
Ответы:
Вы всегда привязываетесь к объекту 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
Вы должны привязаться к представлению, если хотите, чтобы ваша сетка отображала настройки, примененные к представлению, например, фильтрацию, в противном случае представление является избыточным.