kazuakix の日記

Windows Phone とか好きです

ViewModel で画面遷移させたい

こんにちは。 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 ケ所で定義できるので、スッキリしていていいですね。