Должен ли я связать с ICollectionView или ObservableCollection - PullRequest
79 голосов
/ 11 июня 2011

Если связать DataGrid с

ICollectionView = CollectionViewSource.GetDefaultView(collection)

или с

ObservableCollection<T> collection; ???

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

Ответы [ 5 ]

122 голосов
/ 11 июня 2011

Вы всегда привязываете к ICollectionView независимо от того, делаете это явно или нет.

Предположим, что у нас есть

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

В этом случае привязкаcollection или collectionView - это одно и то же: механизм привязки будет привязываться к представлению коллекции по умолчанию (ссылка на который равна collectionView), если вы скажете ему привязаться к collection.

Это означает, что ответ на ваш вопрос «это не имеет абсолютно никакого значения».

Просто чтобы быть полностью ясным: даже если вы привязываете к коллекции напрямую, механизм привязки будетпривязать к виду по умолчанию.Изменение свойств представления, таких как критерии сортировки, повлияет на привязку, которая, по-видимому, привязывается непосредственно к коллекции, поскольку за обложками вместо этого находится привязка к представлению по умолчанию.

Однако есть еще один интересный и связанный вопрос: следует ли связывать с представлением коллекции по умолчанию (т. е. с самой коллекцией, поскольку нет причин явно связывать с представлением по умолчанию) или с другим представлением той же коллекции?

Учитывая, что у каждого представления есть своиИз собственного представления о текущем элементе, критериях сортировки и т. д. следует, что если вы намереваетесь иметь несколько привязок к одной и той же коллекции, а связанные элементы управления должны иметь различные понятия о текущем элементе, фильтрах и компании, то вам нужно явно указатьпривязка к нескольким представлениям одной и той же базовой коллекции.

32 голосов
/ 11 июня 2011

ObservableCollection<T> реализует INotifyCollectionChanged и уведомит пользовательский интерфейс об изменении элементов в коллекции.

ICollectionView даст вам возможность фильтровать, сортировать или группировать коллекцию в дополнение к распространению событий INotifyCollectionChanged, если базовая коллекция реализует это.

Любой тип хорошо работает с MVVM, если вы привязаны к нему. Используйте ICollectionView, когда вам нужна сортировка, фильтрация или группировка. Используйте ObservableCollection<T> напрямую, когда нет.

9 голосов
/ 12 июня 2011

Просто чтобы добавить к тому, что сказал Джон. Основное отличие состоит в том, что с помощью CollectionViewSource.GetDefaultView(collection) вы делаете вашу ViewModel зависимой от WPF. Многим пуристам MVVM это не нравится, и из-за этого ObservableCollection остается только верным вариантом.

Другой вариант - использовать ICollectionView и использовать класс, который его реализует, но не является частью самого WPF.

7 голосов
/ 11 июня 2011

Я не думаю, что это связано с самим MVVM. ICollectionView предоставляет дополнительные функции, такие как группировка и т. Д., Если вам нужно, используйте IColectionView, в противном случае просто используйте ObservableCollection

2 голосов
/ 11 июня 2011

Вы привязываетесь к представлению, если хотите, чтобы в вашей сетке отображались параметры, примененные к представлению, например фильтрация, в противном случае представление является избыточным.

...