Относительно ViewModel

Я изо всех сил пытаюсь понять часть ViewModel в шаблоне MVVM. Мой текущий подход состоит в том, чтобы иметь класс без какой-либо логики (важно), за исключением того, что он реализует INotifyPropertyChanged. Класс — это просто набор свойств, структура, если хотите, описывающая как можно меньшую часть данных. Я считаю это своей Моделью.

Большая часть кода WPF, который я пишу, представляет собой диалоги настроек, которые настраивают указанную модель. Код диалогового окна предоставляет свойство, которое возвращает экземпляр модели. В коде XAML я привязываюсь к подсвойствам этого свойства, тем самым напрямую привязываясь к свойствам модели. Что работает достаточно хорошо, так как реализует INotifyPropertyChanged. Я считаю этот диалог настроек Вид.

Однако я так и не смог понять, что же такое ViewModel во всем этом. В статьях, которые я читал, говорится, что ViewModel должна связать представление и модель вместе, обеспечивая логику, которой не хватает модели, но она все еще слишком сложна, чтобы перейти непосредственно в представление. Это правильно? Будет ли в моем примере программный код диалогового окна настроек считаться ViewModel?

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


person Mizipzor    schedule 02.06.2010    source источник


Ответы (4)


Поскольку ваша модель идеально вписывается в ваше представление, т. е. ваше представление (диалоговое окно настроек) может напрямую связываться со структурами данных модели, вам повезло, что вам нужна модель представления.

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

Взяв ваш пример «диалога настроек», допустим, ваша модель напрямую сопоставляется с таблицей базы данных с полями setting_name, setting_value. Однако, с вашей точки зрения, вы не хотите, чтобы пользователь заполнял какую-либо сетку; скорее, вы хотите, чтобы пользователь заполнил некоторые поля «Имя пользователя», «Почтовый адрес» и т. д. В этом случае вы можете создать модель представления, которая предоставляет такие свойства, как UserName, MailAddress, и внутренне сопоставляет их с вашей моделью.

person Heinzi    schedule 02.06.2010
comment
Я понимаю. Таким образом, выполнение этих переназначений непосредственно в представлении (или, скорее, в коде программной части диалогового окна настроек) будет считаться плохой практикой? - person Mizipzor; 02.06.2010
comment
Это неплохая практика, это просто не MVVM. Вопрос о том, работает ли этот шаблон проектирования для этой части приложения, гораздо шире. В наши дни MVVM сильно разрекламирован, но IMO редко эффективно используется на практике. - person hemp; 02.06.2010
comment
@hemp: +1, это именно то, что я собирался ответить. - person Heinzi; 02.06.2010
comment
@hemp: я согласен с тем, что MVVM сейчас вызывает всеобщую шумиху, но поскольку существует так много (много, если вы спросите меня) способов сделать одну вещь в WPF, я чувствую, что мне нужен шаблон, к которому можно было бы вернуться. помогите мне ориентироваться в кодовой базе GUI. - person Mizipzor; 02.06.2010
comment
@mizipzor: Вот именно: если это помогает вам организовать вашу кодовую базу (путем разделения проблем между кодом пользовательского интерфейса (= представление кода программной части) и кодом преобразования данных (= ViewModel)), то обычно рекомендуется использовать его. - person Heinzi; 02.06.2010

То, что вы считаете своей Моделью, на самом деле является вашей Моделью Представления. ViewModel — это класс, поддерживающий View. У него часто есть API, предназначенный для конкретной технологии (например, WPF или SilverLight).

Таким образом, ViewModel может иметь свойства ICommand и свойства, предоставляющие цвета или кисти для привязки данных. Он также может иметь свойства, которые определяют, включены или отключены определенные элементы управления или вообще видны.

Вся эта логика очень ориентирована на представление и, следовательно, живет в модели представления.

Во всех приложениях, кроме игрушечных, вам также нужна правильная модель предметной области, но вы не хотите загрязнять эту модель всей этой логикой, ориентированной на представление. Это не относится к этому - вы можете повторно использовать модель предметной области для предоставления веб-служб или веб-сайта, а свойства INotifyPropertyChanged, ICommand и многое другое не принадлежат им.

Модель предметной области — это ваша модель в шаблоне MVVM. Модель представления обеспечивает мост между представлением и моделью.

person Mark Seemann    schedule 02.06.2010
comment
Итак, если я правильно вас понимаю, чтобы сделать мою модель правильной моделью, я должен избавиться от INotifyPropertyChanged? Сделать его очень похожим на структуру C? Просто набор значений, объединенных вместе? - person Mizipzor; 02.06.2010
comment
Вам по-прежнему нужна ViewModel со всем материалом INPC, но в MVVM вам также нужна модель. Вам нужны оба, но никто не говорит, что виртуальная машина не может иметь никакого поведения. Мои виртуальные машины обычно ведут себя по-разному, но это зависит от пользовательского интерфейса. - person Mark Seemann; 02.06.2010

ViewModel обычно используется для привязки к тем значениям, которые влияют на внешний вид и поведение вашего представления. В этом конкретном случае вы должны дополнительно абстрагировать свою модель, чтобы представлять только данные настроек, а не поведение. Например, если у вас есть флажок, который при установке делает несколько ползунков недействительными, логика включения/отключения этих ползунков будет предоставлена ​​ViewModel, а не самим представлением и не самой моделью.

Один полезный способ взглянуть на разбиение ваших проектов на MVVM — спросить себя, как бы я провел модульное тестирование поведения моего представления, предполагая, что я не могу взаимодействовать с представлением из моего теста? Часто вы обнаружите, что большая часть вашего поведения на самом деле привязана к представлению и практически не поддается проверке, если не считать функциональных тестов.

person hemp    schedule 02.06.2010

Модель — это модель ваших данных. ViewModel – это модель вашего представления. Представление — это Window, Page или DataTemplate, обычно определяемое в XAML.

Существует тесная связь между представлением и моделью представления. Объекты в представлении привязаны к свойствам модели представления. Если вы измените дизайн представления, вы измените дизайн модели представления. Вообще говоря, модель представления — это то, что вы используете вместо кода программной части.

Существует тесная связь между моделью представления и моделью данных. Экземпляр модели представления обычно содержит ссылку на экземпляр модели данных. Свойства модели представления обновляют свойства в экземпляре модели данных, как правило, когда они установлены. (Хотя это не обязательно. Например, модель представления нередко реализует Command, который обновляет базовый экземпляр модели данных, или реализует IEditableObject.)

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

person Robert Rossney    schedule 02.06.2010