Что должно идти в каждой триаде MVVM? - PullRequest
2 голосов
/ 15 мая 2010

ОК, допустим, я создаю программу, которая будет перечислять контакты пользователей в ListBox в левой части экрана. Когда пользователь нажимает на контакт, в основной части окна появляется группа сообщений или что-то еще.

Теперь мой вопрос: как должны выглядеть триады MVVM? У меня есть две модели: контакт и сообщение. Модель контакта содержит список моделей сообщений.

Каждый объект ViewModel будет содержать одну соответствующую модель, верно?

А как насчет Просмотров? У меня есть «MainView», который является главным окном, которое будет иметь такие вещи, как меню, панель инструментов и т. Д. Я помещаю ListBox в MainView? Моя путаница в том, что и куда ставить; например, что должен содержать ContactView? Просто один экземпляр контакта? Таким образом, DataTemplate, ControlTemplate, контекстные меню, стили и т. Д. Для этого единственного контакта, а затем просто их ListBox в MainView ...?

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 мая 2010

Я думаю, что пока нет четких определений с ViewModels, но вот как я это вижу ...

Viewmodels не должны иметь «дочерних» Viewmodels, это не отношения данных и иерархии. Модель представления представляет одно представление и содержит модель / данные для этого представления. В отличие от этого представление состоит из пользовательских элементов управления, и каждый из этих элементов управления может иметь свою собственную модель представления, DataContext остается таким же, как родительское представление.

Другими словами, иерархия визуальная, а не управляемая данными.

1 голос
/ 17 мая 2010

Сердцем паттерна MVVM является Модель, которая является структурой ваших данных. Таким образом, у вас есть Модель контакта и Модель сообщения, которые связаны и хорошо установлены. Теперь вы хотите создать свой интерфейс. Пользовательский интерфейс содержит одно окно (MainView). Таким образом, вам понадобится одна ViewModel. Так из чего состоит ViewModel?

Предположим, что вы хотите отобразить только один контакт в главном окне, а не коллекцию. Теперь ваша MainViewModel может просто иметь ссылки на свойства вашего контакта, которые должны быть представлены в представлении.

Contact c = /*Retrieve a contact from db*/;

ContactName = c.Name;  //Create these two properties
ContactPhone = c.Phone; //Assuming only these two properties are required by your view

Теперь вы можете привязать эти свойства к вашему MainView следующим образом

<Textbox Text={Binding ContactName} /> <!-- Assuming the DataContext is assigned -->
<Textbox Text={Binding ContactPhone} />

Но мы должны отобразить коллекцию в нашем MainView. Следовательно, мы определяем индивидуальный список как новый вид. Нам также нужен список ContactName и ContactPhone. Следовательно, мы оборачиваем эти два свойства в класс и составляем его список. Этот класс называется ViewModel.

(Здесь вы также должны добавить сообщения собственности)

Следовательно, отдельные представления имеют свою собственную модель представления. Теперь мы интегрируем эти представления в наш MainView.

Теперь, что должен содержать MainViewModel?

  • Список ContactViewModels - ContactList
  • Выбранный ContactViewModel - ВыбранныйКонтакт
  • Список MessageViewModels - SelectedContactMessageList

Как они подключены?

  • ContactList - привязан к списку контактов
  • SelectedContactMessageList - привязан к списку сообщений
  • SelectedContact - привязан к SelectedItem списка контактов. Сеттер должен изменить SelectedContactMessageList в соответствии с Selection следующим образом:
SelectedContactMessageList.Clear();
foreach (Message message in SelectedContact.Messages)
{
    SelectedContactMessageList.Add(new MessageViewModel(message))
}// converting the resulting models from SelectedContact.Messages to viewmodels

Вот и все. Вот как я понял MVVM.

А по поводу

Каждый объект ViewModel будет содержать одну соответствующую модель, верно?

Нет! Вместо каждый вид отображается на одну ViewModel

Создайте ViewModel для каждого View в вашем приложении и имейте только те свойства, которые требуются вашему View, в вашей ViewModel.

0 голосов
/ 15 мая 2010

Каждый объект ViewModel будет содержать одну соответствующую модель, верно?

Нет, если вы просматриваете, скажем, список контактов, а активный контакт со списком просматриваемых сообщений модели может содержать коллекцию объектов модели контактов и модель активного контакта. Последний может содержать коллекцию объектов модели сообщений для этого контакта.

По вашему мнению, вы можете привязать список к MainViewModel.Contacts, а выбранный элемент в списке к MainViewModel.SelectedContact. Список сообщений может быть связан с MainViewModel.SelectedContact.Messages.

...