2010-12-16 2 views
5

プリズム/ mvvm/mefプログラムがうまく動作しているので、ユーザーはアプリケーションにデータを入力してから、アプリケーションを閉じます(またはコンピュータをシャットダウンします)。プログラムを閉じるビュー(モデル)を通知する

プログラムの終了/コンピュータのシャットダウンを通知されたビュー(モデル)を取得するには、どうすればユーザーデータを保存するか、保存するかどうか尋ねることができますか?

プログラムの終了時にデータが失われることは避けなければならないことであり、ユーザーのキーを押すたびにデータを保存することは意味がありません。

答えて

8

興味のあるグローバルな「イベント」のためにクライアントが登録できるCompositeCommandsが公開されています。

public static class HostCommands 
{ 
    private static readonly CompositeCommand Shutdown = new CompositeCommand(); 

    public static CompositeCommand ShutdownCommand 
    { 
     get { return Shutdown; } 
    } 
} 

シャットダウンコマンドを自分のシェルで起動します。

public Shell() 
{ 
    InitializeComponent(); 

    Closing += (sender, e) => 
    { 
     if (HostCommands.ShutdownCommand.CanExecute(e)) 
      HostCommands.ShutdownCommand.Execute(e); 
    }; 
} 

とクライアント次のように登録することができ、例えば

public SomeViewModel(IEventAggregator eventService) 
{ 
    //blah, blah, blah... 

    HostCommands.ShutdownCommand. 
     RegisterCommand(new DelegateCommand<object>(_ => Save())); 
} 

更新

私はキャンセルシナリオを処理しませんが、あなたはに渡されたオブジェクトを介してこれを実装することができコマンド。たとえば上記のコードでは、クライアントが処理できるCancelEventArgsを渡します。つまり、Cancel = trueを設定します。コマンドを実行した後、シェルのクローズイベントハンドラでこの値を調べて、シェルの終了をキャンセルする必要があるかどうかを調べることができました。このパターンを拡大することができます。

+0

素晴らしいですね。ちょうどあなたが "新しいコマンド(_ =>保存())"を書いたSomeViewModelで - これは "新しいDelegateCommand(()=>保存())"ではないはずですか? – Sam

+1

@Samあなたは大丈夫です。私はDelegatedCommandから継承しました。プリズムタイプのみを使用するようにサンプルを更新します。 –

+0

ああ、プリズム・イベンティング(疎結合のイベント)を使うほうが良いかもしれないのだろうかと思うので、バインドを心配する必要はありませんか? – Sam

関連する問題