2012-02-28 11 views
7

私はMVVMの軽いフレームワークを利用してWPFアプリケーションを作っています。ビューからビューを切り替えるにはどうすればよいですか?

私がしようとしているのは、ユーザーがそのビュー内のボタンを押すと、Viewにログインフォームがあり、接続されたViewModelのLoginCommandを起動します。そこから、アプリケーションの残りの部分を保持する新しいウィンドウを起動するか、単に同じウィンドウからビューを切り替えます。

現在、ViewViewにバインドされたコンテンツコントロールを持つMainViewというビューがあります。しかし、View2に切り替えるには、MainViewにボタンを配置する必要があります.View1内のボタンではありません。

アドバイスはありますか?

答えて

7

私は2つの方法のこのいずれかを実行します。

は、ログインウィンドウは、アプリケーションを起動する前に必要な1回限りのものであれば、私はApplicationオブジェクトのOnStartup()方法でそれを置く

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    // Login 
    var login = new LoginDialog(); 
    var loginVm = new LoginViewModel(); 

    login.DataContext = loginVm; 
    login.ShowDialog(); 

    if (!login.DialogResult.GetValueOrDefault()) 
    { 
     // Error is handled in login class, not here 
     Environment.Exit(0); 
    } 

    // If login is successful, show main application 
    var app = new ShellView(); 
    var appModel = new ShellViewModel(); 

    app.DataContext = viewModel; 
    app.Show(); 
} 

私が通常これを行う他の方法は、すべての私のウィンドウ管理を処理するShellViewModelまたはApplicationViewModelです。この方法では、DataTemplatesを使用して各画面を定義し、ShellViewまたはApplicationViewの現在の画面のプレースホルダとしてContentControlを使用します。

私は通常、Microsoft PrismのEventAggregatorのような種類のイベントシステムと組み合わせて、OpenWindowCloseWindowなどの特定の種類のメッセージを聴くことができます。興味があれば、私はCommunication between ViewModelsについてのブログ記事を持っています。これはあなたにイベントシステムがどのように見えるかをよりよく理解させるはずです。

は例えば、私のShellViewModelは(LoginViewLoginViewModelを描画するためにWPFを指示するために使用されDataTemplateLoginViewModelを表示することにより開始する可能性があります、それはタイプSuccessfulLoginのメッセージを受信するためにサブスクライブします。 LoginViewModelSuccessfulLoginメッセージをブロードキャストすると、ShellViewModelLoginViewModelを閉じてApplicationViewModelに置き換えます。あなたは私の記事でこれの例を見ることができますNavigation with MVVM

+0

これはそれを達成するための良い方法のようです。ビューモデルではなく、この機能をコードの背後に置くのに問題はありませんか? – benjgorman

+1

@benjgorman MVVMデザインパターンは、UIコードとアプリケーションコードを別々に保つことを目的としています。UIとアプリケーションオブジェクトの両方を初期化する必要があるため、 'Application'クラスの背後にあるコードは、アプリケーションを起動します。正直なところ、私のアプリケーションでは1つ以上のウィンドウを持つことはめったにありません。私は、現在のコンテンツを管理するために 'DataTemplates'と' ContentControls'を使うことを好みます。あなたはこれの例を見ることができます[ここ](http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel

+0

あなたの答えでは、この部分は頭痛を引き起こしています。 'if(!login.DialogResult。GetValueOrDefault()) { //エラーはログインクラスで処理されますが、ここでは処理されません。 Environment.Exit(0); } ' これをICommandにどのようにバインドしますか? IPropertyChangedEventを使ってみましたが、ログインボックスが表示される前に起動します。 – benjgorman

2

MainWindowの内部にPage要素内にあなたの意見を入れて、最初のページにソースを指します。

その後、フレームのNavigationServiceを使用して、フレームを別のビューに移動することができます。これは、Webブラウザと同様です。通常

関連する問題