Почему мне следует избегать прямого создания экземпляра CollectionView?

документация по Класс CollectionView говорит:

Вы не должны создавать объекты этого класса в своем коде. Чтобы создать представление коллекции для коллекции, которая реализует только IEnumerable, создайте объект CollectionViewSource, добавьте свою коллекцию в свойство Source и получите представление коллекции из свойства View.

Другими словами, я должен написать:

var cvs = new CollectionViewSource();
cvs.Source = myData.Where(d => someCondition(d));
var view = cvs.View;

вместо

var view = new CollectionView(myData.Where(d => someCondition(d));

Однако в документации не объясняется, почему я должен это сделать. Оба варианта похоже работают.

Что плохого произойдет, если я выберу вариант 2 вместо варианта 1?


person Heinzi    schedule 30.10.2018    source источник


Ответы (2)


Есть несколько специализаций класса CollectionView, например, ListCollectionView. Всякий раз, когда вы привязываетесь к какой-либо коллекции, для вас автоматически создается представление на основе типа исходной коллекции. Вместо явного создания CollectionView или CollectionViewSource вы можете получить представление коллекции по умолчанию с помощью статического метода CollectionViewSource.GetDefaultView:

ICollectionView view = CollectionViewSource.GetDefaultView(myData);

Он вернет ListCollectionView, если myData реализует IList.

Совершенно нормально выставлять ICollectionView из модели представления, если вы выполняете там фильтрацию или сортировку. CollectionViewSource в основном используется, когда вы хотите выполнить фильтрацию, сортировку или группировку исходной коллекции в представлении.

person mm8    schedule 01.11.2018

Привязка CollectionView может вызвать проблемы в будущем, если вы захотите изменить способ отображения ваших данных.

Из документации CollectionViewSource:

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

Привязка напрямую к одному CollectionView ограничивает способы отображения данных. Короче говоря, CollectionViewSource лучше работает с вашими коллекциями в XAML при привязке.

person Villhellm    schedule 30.10.2018
comment
Привязка напрямую к одному CollectionView ограничивает способы отображения ваших данных. Что помешает создать несколько CollectionViews вокруг одной и той же коллекции? - person Tesseract; 23.07.2020