2009-06-11 2 views
36

Я разрабатываю приложение WPF с использованием шаблона MVVM, и мне нужно отобразить список элементов в ListView (с фильтрацией), с полями выбранного элемента, отображаемого в представлении «Мастер/Деталь». Я разорван между двумя следующими способами:MVVM: CollectionView в ViewModel или CollectionViewSource в xaml?

  1. Предоставление коллекцииView в моей модели ViewModel и привязка к ней.
  2. Публикация простого IList в моей модели ViewModel и использование CollectionViewSource для создания CollectionView в XAML.

Есть ли принятый способ сделать это? Любые мысли о лучшем пути?

+1

Удивительно, что много раз вы узнали, что кто-то уже выполнил тот же вопрос, что и вы спрашивали. Благодаря! :) –

ответ

30

Я делаю первые (выставляю CollectionView с виртуальной машины), но на самом деле важно, где ваша логика фильтрации. Это обязательно должно быть на виртуальной машине, чтобы ее можно было протестировать, даже если представление должно подключить CollectionViewSource к виртуальной машине. Тем не менее, я не думаю, что есть что-то особенно неприятное или анти-MVVM об экспонировании CollectionView из вашей виртуальной машины.

+0

Вы просто создаете новый CollectionView в ViewModel? MSDN для CollectionView говорит, что вы не должны создавать новый CollectionView, а вместо этого создавать CollectionViewSource и получать представление по умолчанию. Каков наилучший способ создания CollectionView? –

+0

MSDN не совсем ясно, как лучше всего это сделать в коде. Я просто создаю подкласс CollectionView напрямую (например, ListCollectionView), но я полагаю, вы также можете использовать CollectionViewSource. Я понимаю, что CVS просто делает выбор подходящего подкласса CV для вас и предоставляет поддержку XAML. У меня не было проблем с созданием CV, и, похоже, имеет смысл, когда вы делаете это в коде и уже знаете тип собираемой коллекции. –

+0

Не забудьте, что WPF автоматически создает представления для вас, когда вы связываете ... Вы получаете ListCollectionView, когда вы привязываетесь к IList, например. У этого уже есть TONS функции сортировки/фильтрации/группировки, но полагается на то, что вы получаете коллекцию Items объекта, к которому вы привязываетесь. Вместо этого вы можете использовать var view = CollectionViewSource.GetDefaultView (yourCollection) как ListCollectionView ;. Тогда вы можете делать всевозможные классные вещи. – Stimul8d

3

Я знаю, что немного опоздал, отвечая на ваш вопрос, но я только что видел его сегодня.

Я создал мастер-модели/детализованные модели, которые используют CollectionViewSource и сообщают об этом.

я писал о ViewModel для мастер/подчиненной таблиц здесь, использующем: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

Вы также можете найти ViewModel для класса ObservableCollection на моих страницах блога.

Возможно, вы найдете его полезным для вас.

Смежные вопросы