почему пустой код считается хорошо разработанным MVVM
Наличие файла с выделенным кодом, который состоит исключительно из вызова InitializeComponent () в его конструкторе, означает, что вы достигли чистоты - у вас абсолютно нулевая логика в вашем коде. Вы не загрязнили свое представление каким-либо кодом, который по праву принадлежит модели или модели. Это означает пару вещей:
- модель представления (и модель) легче тестировать в изоляции
- вы достигли хорошего уровня слабой связи, что дает отличные преимущества с точки зрения обслуживания и расширяемости
Преимущества действительно становятся заметными, когда вам приходится менять свой пользовательский интерфейс, т. Е. Переходить от использования ListView к DataGrid или переходить от использования стандартных элементов управления Microsoft к использованию других поставщиков.
Как уже упоминалось, иногда невозможно избежать небольшого кода в файле code-behind. Вам следует убедиться, что код, который у вас есть, имеет чисто пользовательский интерфейс. Например, если у вас есть ComboA и ComboB, и ComboB установлен в ответ на выбор в ComboA, тогда установка SelectedIndex ComboB из представления является хорошей, но установка Items или SelectedItem ComboB - нет - эти свойства оба связаны с данными и должны быть указаны через привязку к модели представления. Свойство SelectedIndex напрямую визуально связано и несколько не зависит от фактических данных (и не имеет отношения к модели представления).
Если вы обращаетесь к модели представления из кода в представлении, вы должны попытаться сделать это через интерфейс. Это означает, что ваша модель представления внедряется или передается представлению в качестве интерфейса. (Обратите внимание, что подсистема привязки не знает и не заботится об интерфейсе, она будет продолжать связываться в обычном режиме. Это обеспечивает лучший код с менее тесной связью). Как я его кодирую, модель представления не имеет представления о существовании представления, и представление знает только о модели представления как о интерфейсе.
Однако следует помнить, что MVVM - это шаблон, а шаблон - это просто рецепт или рецепт для достижения определенного результата в определенной ситуации. Это не должно восприниматься как религия, когда неверующие или неконформеры собираются отправиться в какое-то чистилище (хотя следование шаблону хорошо, если вы хотите избежать чистилища ада обслуживания и код запаха ).
Если вам нужен отличный пример того, как этот конкретный шаблон помогает, попробуйте написать несколько достаточно сложных экранов в ASP.Net, а затем напишите то же самое в WPF или Silverlight и обратите внимание на разницу.
Edit:
позвольте мне ответить на некоторые ваши вопросы, надеюсь, это поможет ....
Роль модели представления (модель представления), на мой взгляд, имеет логику пользовательского интерфейса и состояние представления.
У модели представления никогда не должно быть логики пользовательского интерфейса или "состояния просмотра". Для целей этого объяснения я бы определил состояние просмотра как положение прокрутки, индекс выбранной строки, выбранный индекс, размер окна и т. Д. Ни один из них не принадлежит модели представления; Такие вещи, как SelectedIndex, зависят от способа отображения данных в пользовательском интерфейсе (если вы измените порядок сортировки DataGrid, SelectedIndex может измениться, даже если SelectedItem остается прежним). В этом конкретном случае SelectedItem может быть привязан к модели представления, но SelectedIndex не должен.
Если вам нужно отслеживать информацию о типе сеанса пользовательского интерфейса, то вам следует придумать что-то общее (например, я сохранил состояние просмотра ранее, сохраняя важные данные в списке KeyValuePair), которое затем «сохраняется» с вызовом viewmodel (через интерфейс, о котором я упоминал ранее). Представление не имеет представления о том, как сохраняются данные, а модель представления не имеет представления о том, что данные поступают из представления (оно просто представило вызов через свой интерфейс).
и роль представления заключается в отображении некоторого содержимого и синхронизации модели представления (с кодом привязки данных)
Да, представление просто отвечает за визуальное отображение данных, представленных моделью представления.Модель представления получает данные из модели (модель отвечает за выполнение вызовов базы данных или вызовов веб-службы WCF, обычно это делается через «службу», но это совсем другое обсуждение).Затем модель представления может формировать или манипулировать данными, то есть она может получать список всех клиентов, но только отображать отфильтрованную версию этого списка (может быть, текущих клиентов) в общем свойстве, которое представление может затем связать.Если данные должны быть обработаны во что-то визуальное (общий пример - значение перечисления, переводимое в цвет), тогда модель представления все еще имеет только значения перечисления, и представление все еще привязывается к этому значению, но представление также использует конвертер для перевода чистых данных в визуальное представление.Используя конвертер, модель представления по-прежнему избегает каких-либо действий, связанных с пользовательским интерфейсом, а представление избегает какой-либо реальной логики.