Должен ли я привязываться к ICollectionView или ObservableCollection
Если привязать DataGrid
к
ICollectionView = CollectionViewSource.GetDefaultView(collection)
или к
- Общий class наблюдаемого словаря для DataBinding / WPF C #
- WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
- ElementName привязка из MenuItem в ContextMenu
- Связывание в WPF с элементом массива, заданным свойством
- Принуждение WPF TextBox больше не работает в .NET 4.0
ObservableCollection collection;
???
Какова наилучшая практика для MVVM и почему?
- Связывание Richtextbox wpf
- Связывание WPF ComboBox с пользовательским списком
- Каковы различные режимы привязки WPF?
- Привязка данных Android с использованием тега include
- ItemsControl с несколькими DataTemplates для viewmodel
- Нажатие свойств GUI только для чтения обратно в ViewModel
- Связывающие свойства в коде
- Заполнить Combobox из базы данных
Вы всегда привязываетесь к ICollectionView
, независимо от того, используете ли вы его явным или нет.
Предположим, что имеем
var collection = new ObservableCollection(); var collectionView = CollectionViewSource.GetDefaultView(collection);
В этом случае привязка к collection
или collectionView
является одним и тем же: механизм привязки привязывается к представлению коллекции по умолчанию (которое является ссылкой, равным collectionView
), если вы скажете ему привязать к collection
.
Это означает, что ответ на ваш вопрос «это абсолютно не имеет значения».
Просто чтобы быть абсолютно ясным: даже если вы привязываетесь непосредственно к коллекции, механизм привязки привязывается к представлению по умолчанию. Изменение свойств представления, таких как критерии сортировки, повлияет на привязку, которая, как представляется, привязывается непосредственно к коллекции, поскольку позади обложек это привязка к представлению по умолчанию вместо.
Однако есть еще один интересный и смежный вопрос: следует ли привязать к представлению коллекции по умолчанию (то есть к самой коллекции, потому что нет причин явно привязываться к представлению по умолчанию) или к другому представлению той же коллекции?
Учитывая, что каждая точка зрения имеет свое собственное представление о текущем элементе, критериях сортировки и т. Д., Следует, что если вы намереваетесь иметь несколько привязок к одной коллекции, а связанным элементам управления должны быть разные понятия текущего элемента, фильтров и компании, тогда вы хотите явно привязать к нескольким представлениям одной и той же базовой коллекции.
ObservableCollection
реализует INotifyCollectionChanged
и будет уведомлять пользовательский интерфейс, когда элементы в коллекции были изменены.
ICollectionView
предоставит вам возможность фильтровать, сортировать или группировать коллекцию в дополнение к INotifyCollectionChanged
событий INotifyCollectionChanged
если базовая коллекция реализует ее.
Любой тип работает хорошо с MVVM, пока вы привязываетесь к нему. Используйте ICollectionView
когда вам нужна сортировка, фильтрация или группировка. Используйте ObservableCollection
непосредственно, когда вы этого не сделаете.
Просто добавлю, что сказал Джон. Основное отличие состоит в том, что с помощью CollectionViewSource.GetDefaultView(collection)
вы делаете ViewModel в зависимости от WPF. Многим пуристам MVVM это не нравится, и это оставило бы ObservableCollection только действительный вариант.
Другим вариантом будет использование ICollectionView
и использование classа, который его реализует, но не является частью самого WPF.
Я не думаю, что он должен что-то делать с MVVM
. ICollectionView
предоставляет дополнительные функции, такие как группировка поиска и т. Д., Если вам нужны те, которые используют IColectionView
иначе просто используйте ObservableCollection
Вы привязываетесь к представлению, если хотите, чтобы ваша grid отображала параметры, применяемые к представлению, например, фильтрацию, в противном случае представление является избыточным.