Должен ли я привязываться к ICollectionView или ObservableCollection

Если привязать DataGrid к

ICollectionView = CollectionViewSource.GetDefaultView(collection)

или к

ObservableCollection collection; ???

Какова наилучшая практика для MVVM и почему?

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

  • Связывание Richtextbox wpf
  • Общий class наблюдаемого словаря для DataBinding / WPF C #
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • Управление несколькими выборами с помощью MVVM
  • ItemsControl с несколькими DataTemplates для viewmodel
  • Похоже, что привязки данных не обновляются
  • Как обнаружить сломанные привязки данных WPF?
  • Что означает «{Binding Path =.}» В привязке WPF?
  • Перетаскивание из источника данных в окно WPF не работает
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Связывание WPF ComboBox с пользовательским списком
  • Давайте будем гением компьютера.