Мне нравится ваш пример выше, я думаю, что он воплощает дух MVVM. Просто для пояснения, однако, код ViewModel и код модели не должны находиться в том же исходном файле, что и реальный код позади. На самом деле, я бы сказал, что они не должны быть в одном проекте.
Вот MVVM, как я понимаю:
M - Модель - это данные, возвращаемые из бизнес-уровня (BL). Это должно быть легко, содержать данные только для чтения. Классы Model являются немыми и не содержат логику Update, Write или Delete и генерируются BL в результате запросов, команд, действий и т. Д. Классы Model не знают о потребностях представления приложения-потребителя, поэтому они могут быть использованы любым способом применения. Чтобы по-настоящему воспользоваться этим повторным использованием, мы хотим, чтобы классы Model были независимы от проекта пользовательского интерфейса.
VM - ViewModel содержит коммуникационный уровень: он отправляет запросы BL и обрабатывает результаты способом, подходящим для представления. Как и в примере выше, он также получает модель и форматирует ее для конкретных потребностей презентации. Думайте об этом как о «Связующем классе». В приведенном выше примере данные просто перемещаются из одного объекта в другой, но ViewModel будет нести ответственность за такие вещи, как предоставление свойства типа «FullName» или добавление начальных нулей в ZipCode. Это верно, что класс привязки является тем, чтобы реализовать INotifyPropertyChanged. И снова, для повторного использования, я бы, вероятно, извлек этот слой в свой собственный проект. Это позволило бы вам поэкспериментировать с различными вариантами пользовательского интерфейса без каких-либо изменений в системе.
V - представление привязано к объекту класса Binding, созданному в виртуальной машине. Вид очень тупой: он ничего не знает о BL или VM. Данные могут быть связаны в обоих направлениях, но виртуальная машина обрабатывает ошибки, проверку и т. Д. Любые операции синхронизации данных обрабатываются путем передачи запросов обратно в BL и повторной обработки результатов.
Это будет зависеть от типа приложения, но кажется трудным постоянно проверять модель, чтобы увидеть, изменилась ли она. Представьте, что вы подключаетесь к BL, который построил бизнес-объект (BO) из DAL, который подключается к БД. В этом сценарии вы бы постоянно воссоздали BO, который, я уверен, был бы убийцей производительности. Вы могли бы реализовать систему проверки на BL, которая прослушивала уведомления, или иметь метод для сравнения последнего известного времени изменения с фактическим, или вы могли бы кэшировать BO на BL. Просто некоторые идеи.
Кроме того, я сказал выше, что модель должна быть облегченной. Есть тяжелые варианты, такие как CSLA, но я не уверен, насколько хорошо они вписываются в идею MVVM.
Я не хочу выдавать себя за эксперта, я до сих пор изучал эти идеи только при разработке архитектуры нашего нового программного обеспечения. Я хотел бы прочитать некоторые обсуждения по этой теме.