Подтвердить что ты не робот

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

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

ICollectionView = CollectionViewSource.GetDefaultView(collection)

или

ObservableCollection<T> collection;

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

4b9b3361

Ответ 1

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

Предположим, что

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

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

Это означает, что ответ на ваш вопрос: "Это абсолютно не имеет значения".

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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