Если привязаться 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
Вы должны привязаться к представлению, если хотите, чтобы ваша сетка отображала настройки, примененные к представлению, например, фильтрацию, в противном случае представление является избыточным.