С одной стороны, 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 и покрыть ее модульными тестами. Кроме того, проверка может быть на уровне модели в качестве дополнительной проверки, поскольку модель не может быть в недопустимом состоянии.