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