Разъяснение MVVM: Что принадлежит ViewModel, что входит в Model? - PullRequest
9 голосов
/ 17 февраля 2010

Итак, я снова заглянул в MVVM через некоторое время, когда я действительно не следил за новыми разработками, и я заметил, что количество учебных пособий / руководств и т. Д. Значительно возросло.Однако большинству примеров / примеров реализации MVVM не хватает объяснения того, что мне не совсем понятно.Все эти примеры довольно просты, и ни один из них не читает что-либо из базы данных / файла / и т. Д.

Теперь, например, у меня есть какое-то приложение, похожее на рисование, и я сохраняю рисунки в XAML.Что входит в ViewModel, что входит в модель?

Предоставляет ли модель функции для загрузки / сохранения рисунков из / в файл XAML?

Привязывает ли ViewModel к свойствам, которые предоставляет Модель (Цвет, Ширина, Положение и т. Д.)?

Проверка происходит в Модели или в ViewModel?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

ViewModel - это представление модели, которая подходит для используемой вами технологии презентации.

В вашем примере я считаю, что Модель не будет предоставлять функции для загрузки / сохранения рисунков из / в файл XAML. Это будет выполнено в объекте / репозитории доступа к данным, который будет вызван ViewModel, принимающим экземпляры модели в качестве входных данных. Этот бит часто переменный и зависит от того, как выглядят ваши классы Model.

Сама ViewModel обычно не использует привязку данных. Он просто предоставляет модель представлению таким образом, который полезен для технологии представления (представления). В случае WPF / Silverlight это в основном означает, что он реализует интерфейс INotifyPropertyChanged.

Проверка обычно инициируется представлением (как почти все), выполняемым во ViewModel, но часто делегируемым ViewModel в модель. Конечно, лучше не повторять проверки на протяжении всей заявки. Лучшее место для общих проверок - Модель (см. IDataErrorInfo). Однако проверки, относящиеся к вашей ViewModel, могут быть обработаны непосредственно в ViewModel.

0 голосов
/ 22 марта 2013

С одной стороны, ViewModel может быть оболочкой для объекта Model и дополнять его деталями презентации. Например, если у вас есть объект Model - Pen, то PenViewModel может содержать свойства IsSelected, IsDragging и т. Д. Это ViewModel в качестве оболочки .

С другой стороны, ViewModel может быть абстракцией над View, которая не содержит ссылки на конкретные элементы управления. Не забывайте, что целью MVVM является модульное тестирование . Например, у вас есть перетаскиваемые полосы в вашем приложении для рисования. Таким образом, вы можете абстрагировать эту функцию с помощью набора ViewModels: BarViewModel {IsSnapped, Position, IsEnabled}, BrushBarViewModel: BarViewModel, PenBarViewModel и т. Д. И затем вы можете покрыть эту функцию с помощью модульных тестов, но все эти вещи не имеют отношения к модели. Это ViewModel как абстракция представления .

Модель очень близка к бизнесу, содержит бизнес сущности и логику, классы для сохранения сущностей, сервисы. Вы можете использовать разные концепции в вашей модели, например, DDD (Domain-Driven-Design), корпоративные шаблоны Fawler, CQRS (разделение ответственности по командным запросам), SOA (сервис-ориентированная архитектура).

Просмотр состояния синхронизации с ViewModel (Model) с использованием механизма привязки , наихудший случай в коде позади, как в шаблоне PresentationModel.

Основываясь на этом, ответом на ваши вопросы будет:

Предоставляет ли Модель функции для загрузки / сохранения картин из / в файл XAML?

Нет. Модель не имеет прямой ссылки на какие-либо файлы XAML.

Привязывает ли ViewModel к свойствам, которые предоставляет Модель (Цвет, Ширина, Положение и т. Д.)?

Нет. Привязка - это механизм синхронизации View. Так что вам нужно привязать View к этим свойствам. Вы можете привязать View напрямую к Model или к оболочке ViewModel.

Проверка происходит в модели или во ViewModel?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...