Должен ли мой ViewModel иметь ObservableCollection of Views или ViewModels?

Я пытаюсь понять базовый подход MVVM при использовании ItemsControl, привязывая его через DataTemplates к ObservableCollections в ViewModel.

Я видел примеры, которые связываются с ObservableCollections строк, Views и ViewModels.

Привязка к строкам, по-видимому, относится только к demos, это привязка к " ViewModels, которые содержат коллекции Views, которые содержат коллекции ViewModels", что мощность WPF кажется, действительно выходит.

Для тех, кто пользуется шаблоном MVVM, каков ваш стандартный подход к привязке ItemsControl, ListView, ListBox к коллекциям в ViewModel? Я ищу советы из этого опыта:

  • всегда использовать ObservableCollection <... > и никогда не List <... > потому что...
  • что-то лучше, чем ItemsControl для отображения коллекции...
  • чтобы заставить фильтр работать в вашей ViewModel вместо кода, используйте...
  • использовать коллекции Views, когда... и коллекции ViewModels, когда...
  • 90% времени я создаю ItemControl и привязываю его к ObservableCollection of Views, у которых есть свои собственные ViewModels...

Ответ 1

Я бы использовал ObservableCollection ViewModels по следующим причинам:

  • ObservableCollection уже имеет события, доступные для сигнализации, когда он был изменен (например, когда элементы добавлены/удалены из коллекции).
  • Мы находимся на уровне ViewModel, поэтому он обеспечивает более чистое разделение, чтобы ViewModel содержал коллекцию ViewModels, а не Views
  • Если необходимо изменить или получить данные из элементов в коллекции, вы можете более легко изменить/получить доступ к этим данным, если элементы являются ViewModels (если они представляют собой виды, вы часто будете бросать View DataContext или получать доступ к его интерфейсу элементы).

Ответ 2

Мне нравится использовать ObservableCollection из ViewModels. Представление, которое связывается с коллекцией, может определить DataTemplate, который дает ViewModel его внешний вид. Это приводит к меньшему сцеплению компонентов.

Ответ 3

У меня есть тот же вопрос, но замените "представление" на "модель".:)

У меня есть модель с коллекцией других моделей. Я хочу, чтобы моя viewmodel имела наблюдаемую коллекцию других моделей viewmodels, но как только я создаю ее так: связь между содержимым коллекции модели теряется. Должен ли я теперь начать проводку всех событий из наблюдаемой коллекции viewmodels обратно в коллекцию моделей?