こんにちは。 MVVM 入門中の kazuakix です。
今日ちょっとだけコードを書いていて出てきた疑問。「ViewModel から別ページに移動するにはどうしたらいいのか?」
普段の方法
View に書く場合は、Page クラスが Frame を持っているので Frame.Navigate メソッドで移動するだけです。
Frame.Navigate(typeof(NextPage), parameter);
普通ですね。
App クラスで Frame を公開する方法
検索してみると「 App.xaml.cs で Frame を公開してしまうのが楽でいいよ」という情報を見つけました。
App.xaml.cs
public static Frame RootFrame; protected override void OnLaunched(LaunchActivatedEventArgs e) { //Frame rootFrame = Window.Current.Content as Frame; RootFrame = Window.Current.Content as Frame;
ViewModel
private void NavigateNextPage(object parameter) { App.RootFrame.Navigate(typeof(NextPage), parameter); }
単純でわかりやすいんですが、ViewModel が Application クラスに依存しているのがいいのか ちょっと悩ましいですね。
他の MVVM ライブラリでは...
Prism なんかではApplication クラスにあたる MvvmAppBase クラスが持っているINavigationService インタフェースのインスタンスを ViewModel に渡しているようです。
この例に倣うなら、ViewModel 生成時に Frame を渡しておけばいいのでしょうか...なんだか面倒なので 上記案を採用したくなります。その点 Prism は View と ViewModel の対応を 1 ケ所で定義できるので、スッキリしていていいですね。