Я уверен, что есть люди, которые будут спорить так или иначе. С моей точки зрения, все зависит от того, какой код нужно использовать повторно. Существуют как View-ориентированные, так и Model-ориентированные способы построения ваших ViewModels, и я не думаю, что любой из них всегда будет правильным подходом.
Если вы обнаружите, что ваши ViewModel, как правило, сильно зависят от логики пользовательского интерфейса, хороший дизайн будет стремиться к соотношению 1: 1 между Views и ViewModel, при этом каждая ViewModel будет включать несколько моделей. Опасность в этом подходе состоит в том, что вы можете потратить много кода, соединяя данные в каждой ViewModel и поддерживая их синхронизацию, и эту проводку нужно будет повторять для каждой ViewModel. Uggh.
Однако, у вас также может быть ситуация (как я делаю в моем текущем проекте), когда ViewModels должны справляться со сложными отношениями в базовой модели, и когда различные сущности модели могут обновляться с нескольких конечных точек (т.е. пользователь или дуплексный сервис WCF). В этом случае вы проводите много времени в каждой ViewModel, следя за тем, чтобы его данные были синхронизированы с базовыми моделями, и было бы глупо заново выполнять всю эту логику в каждой ViewModel. В этом сценарии я обнаружил, что самый чистый подход заключается в том, чтобы ваши ViewModels отображали более или менее 1: 1 с моделями и могли повторно использоваться в нескольких представлениях. Недостатком этого подхода является то, что в конечном итоге вы можете получить много специфичного для пользовательского интерфейса кода из различных различных представлений, смешанных в одном классе, что может затруднить его тестирование и сопровождение. (Да, я знаю, что ViewModels, как предполагается, не тесно связаны с каким-либо конкретным пользовательским интерфейсом, но вы по-прежнему получаете большой код, который фактически говорит: «Когда пользователь выполняет эту команду, привязанную к некоторому элементу пользовательского интерфейса, который я» Я притворяюсь, что ничего не знаю, делаю то, что я притворяюсь, что я не знаю, приведет к тому, что диалоговое окно будет поднято. "Даже на этом уровне абстракции логика, закодированная в ViewModel, может отличаться от Вид на вид.)
Затем существуют различные гибридные подходы, которые, вероятно, наиболее полезны в реальных сценариях. Например, вы можете в конечном итоге использовать иерархию наследования в своих моделях представления, чтобы иметь дело с универсальной разводкой в одном или нескольких базовых классах, а затем добавить специфичные для пользовательского интерфейса элементы в классах далее по цепочке наследования.
Что бы это ни стоило, одно из моих разочарований в большинстве статей о MVVM, а также то, что они имеют дело с чрезмерно упрощенными сценариями, которые не отражают сложность, с которой вы сталкиваетесь в реальном мире. Как только вы прошли через форму Customer -> Order -> OrderDetail, я обнаружил, что большинство прочитанных рекомендаций, как правило, ломаются, и я остаюсь в одиночестве.