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

  • Можно ли связать свойство Canvas's Children в XAML?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Есть ли способ определить, где объявляется / создается привязка WPF?
  • Как правильно привязать xml к WPF DataGrid?
  • WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
  • Для чего нужен DataContext?
  • Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
  • Как обнаружить сломанные привязки данных WPF?
  • Что означает «{Binding Path =.}» В привязке WPF?
  • WPF перед записью
  • Управление несколькими выборами с помощью MVVM
  • Interesting Posts

    Удалите пользователя в Windows XP, не можете найти кнопку удаления или не показывать

    Fedora-13 не обнаруживает корпус USB HDD (с HDD)

    Ограничение доступа в Интернет на некоторых компьютерах

    Частичное совпадение аргумента функции

    Почему 16 байтов рекомендуемый размер для структуры в C #?

    Как сохранить PictureBox.Image в файл?

    Ошибка установки Intel HAXM. Этот компьютер не поддерживает технологию Intel Virtualization Technology (VT-x)

    Уменьшение переключения режима видео во время загрузки Linux

    C # – Несколько общих типов в одном списке

    ASP.NET MVC – привязка объекта типа «MODELNAME» не удалась, поскольку другой объект того же типа уже имеет такое же значение первичного ключа

    Является ли это REST API действительно RPC? Рой Филдинг, кажется, так думает

    Как получить пользовательский формат даты в Excel

    Как поддерживать небольшой дифференциальный жесткий диск Virtualbox

    Когда я не должен реализовывать черту для ссылок на разработчиков этой черты?

    Не удается найти менеджера AVD или SDK в Eclipse

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