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

  • Привязка OneWayToSource от свойства readonly в XAML
  • Каковы различные режимы привязки WPF?
  • Обнаружение ошибок проверки WPF
  • Есть ли способ определить, где объявляется / создается привязка WPF?
  • ElementName привязка из MenuItem в ContextMenu
  • WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
  • Нажатие свойств GUI только для чтения обратно в ViewModel
  • WPF перед записью
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • WPF: привязка ContextMenu к команде MVVM
  • Для чего нужен DataContext?
  • Interesting Posts

    Ajax.BeginForm в MVC для загрузки файлов

    Свойство «имя» является частью ключевой информации объекта и не может быть изменено. Основы Entity Framework

    Outlook 2007 переустановить и импортировать из резервной копии, теперь у меня есть дубликаты всего

    Windows 7 search: multiple condition "найти папки такого размера, которые не содержат этого и того"

    Импортирование вложенных пространств имен автоматически в C #

    Использование VirtualPathProvider для загрузки представлений ASP.NET MVC из DLL

    Как я могу удаленно запускать сценарии на нескольких серверах, добавлять выходные данные

    Есть ли ярлык для создания нового файла?

    Запуск внешней программы с перенаправленным stdin и stdout из Java

    конвертировать double в int

    Есть ли способ программно преобразовать строки форматирования VB6 в строки форматирования .NET?

    Действительно ли необходим Delegate.EndInvoke ()?

    Макет сетки Vs. Макет таблицы

    AudioTrack, SoundPool или MediaPlayer, которым я должен пользоваться?

    Как создать гибридный раздел MBR / GPT на USB-накопителе?

    Давайте будем гением компьютера.