Пример # 1: у меня есть представление, отображаемое в моем приложении MVVM (давайте использовать Silverlight для целей обсуждения), и я нажимаю кнопку, которая должна перенести меня на новую страницу.
Пример # 2: В этом же представлении есть еще одна кнопка, которая при нажатии открывает окно подробностей в дочернем окне (диалоге).
Мы знаем, что будут объекты Command, представленные нашей ViewModel, привязанными к кнопкам с методами, которые реагируют на щелчок пользователя. Но что тогда? Как мы закончим действие? Даже если мы используем так называемый NavigationService, о чем мы говорим?
Чтобы быть более конкретным, в традиционной модели View-first (такой как схемы навигации на основе URL-адресов, такие как в Интернете или встроенной инфраструктуре навигации SL), объектам Command необходимо знать, какой View будет отображаться следующим. Это, кажется, пересекает черту, когда дело доходит до разделения проблем, продвигаемых шаблоном.
С другой стороны, если кнопка не связана с объектом Command и ведет себя как гиперссылка, правила разметки могут быть определены в разметке. Но хотим ли мы, чтобы представления управляли потоком приложений и не были ли навигация просто еще одним типом бизнес-логики? (Я могу сказать да в некоторых случаях и нет в других.)
Для меня утопическая реализация шаблона MVVM (и я слышал, что другие утверждают это) состояла бы в том, чтобы иметь ViewModel, подключенный таким образом, чтобы приложение могло работать без головы (то есть без Views). Это обеспечивает большую площадь поверхности для тестирования на основе кода и делает представления настоящей оболочкой для приложения. И моя ViewModel не должна заботиться, отображается ли она в главном окне, плавающей панели или дочернем окне, не так ли?
В соответствии с этим подходом во время выполнения это зависит от какого-то другого механизма, связывающего то, что View должно отображаться для каждой ViewModel. Но что, если мы хотим поделиться View с несколькими ViewModels или наоборот?
Таким образом, учитывая необходимость управлять отношениями View-ViewModel, чтобы мы знали, что отображать, когда наряду с необходимостью перемещаться между представлениями, включая отображение дочерних окон / диалогов, как мы действительно выполняем это в шаблоне MVVM?