Роль модели в MVVM

Я прочитал несколько статей о роли модели (данных) в шаблоне MVVM. Тем не менее, я все еще не мог понять, что входит в модель.

Если модель реализует INotifyPropertyChanged? Если да, то какая разница между VM и моделью?

Если нет, изменение в Модели не будет уведомлять VM и View о том, что это произошло. Итак, учитывая, что логика входит в модель, кажется очевидным, что она должна уведомить ViewModel о некоторых ее изменениях. Однако разве не странно реализовать INotifyPropertyChanged в обоих классах?

Большое спасибо!

Ответ 1

Из одного из ваших комментариев:

мне кажется странным, что модель реализует INotifyPropertyChanged, которая кажется мне классом, соответствующим UI

Измените уведомление, используемое во всех видах контекстов, а не в контекстах пользовательского интерфейса. Например, вы можете захотеть прикрепить часть диагностического кода, который регистрирует определенные изменения в TextWriter. Это легко осуществить без изменения базового объекта модели, если объект реализует уведомление об изменениях.

Но даже в приложении, где он используется только для обновления пользовательского интерфейса, этот шаблон все еще имеет смысл. Поскольку уведомление об изменении обрабатывается через событие, объект, поднимающий событие, отделяется от объекта, обрабатывающего его. Ваша модель не знает и не нуждается в том, какой пользовательский интерфейс ее использует. Это просто говорит: "Предполагая, что есть пользовательский интерфейс, мне нужно сказать ему, что бы это ни было, что это значение свойства просто изменилось".

Итак, почему существует модель представления? Почему бы просто не привязать к модели напрямую? Фактически, вы можете просто привязываться к модели напрямую, если она реализует уведомление об изменении. Во многих простых приложениях WPF не обязательно должна быть отдельная модель представления - вы можете просто реализовать уведомление об изменении в модели и назвать ее днем. Это когда вам нужно отделить пользовательский интерфейс от основной бизнес-логики, и вы начинаете беспокоиться о том, нарушаете ли вы принцип единой ответственности, что возникает необходимость в модели представления.

Ответ 2

Модель реализует вашу бизнес-логику. Модель представления украшает вашу бизнес-логику с целью ее отображения и взаимодействия с ней в представлении (пользовательский интерфейс некоторой формы, например, web, winform, CLI). Итак, нет, я бы не сказал, что ваша модель должна реализовывать INotifyPropertyChanged, если она не сделает это как часть вашей основной бизнес-логики.

Ответ 3

В некоторых случаях модель должна реализовать INotifyPropertyChanged. Представьте, что вы кодируете клиента для ICQ или что-то в этом роде. Как должен предполагать ViewModel, чтобы кто-то отправил вам сообщение?

Разница между Model и ViewModel:

ViewModel только упрощает вывод из модели. Если модель очень проста, ViewModel не требуется.