Навигация в сабжевых платформах проста, но доставляет некоторый зуд в некоторых местах при попытке красиво связать ее с MVVM. К примеру, в Windows Phone навигация происходит только по ccылкам с возможностью задать параметры только в URI (т.е. строками) что особенно доставляет удовольствие при перемещении представлений в другие папки
Navigate(Uri uri)
тогда как в Windows Store интерфейс немного улучшили и дали возможность передавать объект
Navigate(Type pageType, object argument)
Тут есть интересная особенность – argument должен быть сериализуемым, иначе он пройдет на страницу успешно но поломает NavigationState (функция GetNavigationState зависнет при вызове).
Собственно, задача mvvm-навигации – это красивое связывание представлений с вьюмоделями и передача вьюмоделей при переходе на представления. Задавшись такой задачей я написал небольшой тулкит с примерами для Windows Store и Windows Phone.
Как это выглядит?
Регистрация
И так, сперва нам надо собственно связать представления с вьюмоделями (в качестве IoC я использую Autofac в примерах):
_navigationBuilder
.RegisterViewModel<FrameViewModel>().StaticResource().WithoutView()
.RegisterViewModel<MainViewModel>().Singleton().ForView<MainPage>()
.RegisterViewModel<NotesViewModel>().StaticResource().ForView<NotesView>()
.RegisterViewModel<NoteViewModel>().ForView<NoteView>()
.RegisterViewModel<AppSettingsViewModel>().ForView<AppSettingsView>()
;