Итак, вот мое несколько скучное описание того, что мы в итоге сделали:
Сначала мы решили использовать встроенную инфраструктуру навигации по страницам.У нас было несколько причин, но, поскольку он является встроенным и также является средой навигации в Windows 8, мы решили попробовать этот подход.
Я должен также упомянуть, что мы используем MVVM Light и MEF в наших приложениях,(Это вступает в игру ниже.)
Чтобы сделать это, мы создали оболочку приложения (UserControl), которая содержит элемент управления Frame.Для DataContext оболочки установлен экземпляр ShellViewModel, который предоставляет одно свойство CurrentPage (типа String).Затем мы привязываем свойство Source фрейма к CurrentPage.Этот подход похож на ViewModel уровня приложения Рэйчел.
ShellViewModel регистрируется в Messenger для получения сообщений CurrentPageChanged.Когда сообщение получено, свойство CurrentPage обновляется, возникает событие PropertyChanged и обновляется пользовательский интерфейс.Сообщение исходит из NavigationService (который реализует INavigationService и вводится / импортируется с использованием MEF).
NavigationService предоставляет метод NavigateTo, который принимает строковое имя ViewModel, представляющее пункт назначения.Это имя совпадает с именем контракта, примененным к ViewModel при экспорте (используя MEF) и используемому для поиска экземпляра с помощью нашего ViewModelLocator.
В методе NavigateTo мы используем ViewModelLocator, чтобы извлечь экземпляр ViewModel, вызвать Deactivate onтекущей ViewModel (если она есть), вызовите Activate для новой ViewModel, затем отправьте сообщение CurrentPageChanged с именем нового представления в качестве параметра.Activate / Deactivate - это вспомогательные методы в ViewModel, которые позволяют нам выполнять любые необходимые задачи, когда ViewModel перемещается в или из.
Это, кажется, работает хорошо и дает нам очень реализацию MVVM-ish со всей навигациейизолированный от наших ViewModel через INavigationService и обмен сообщениями.
Единственный недостаток в настоящее время заключается в том, что, хотя мы используем строковые константы в коде для представления имен ViewModel, мы все еще жестко кодируем строки в представленияхустановить DataContext.Я буду искать способ автоматической установки DataContext как части навигационного «инструмента».
Следует отметить, что этот подход был проанализирован из ряда источников, включая (но не ограничиваясь ими)к) Рейчел и следующие ссылки:
http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/01/25/adapting-silverlight-navigation-to-mvvm.aspx
http://blog.galasoft.ch/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx
http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html