興味のあるグローバルな「イベント」のためにクライアントが登録できる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を設定します。コマンドを実行した後、シェルのクローズイベントハンドラでこの値を調べて、シェルの終了をキャンセルする必要があるかどうかを調べることができました。このパターンを拡大することができます。
素晴らしいですね。ちょうどあなたが "新しいコマンド(_ =>保存())"を書いたSomeViewModelで - これは "新しいDelegateCommand(()=>保存())"ではないはずですか? – Sam
@Samあなたは大丈夫です。私はDelegatedCommandから継承しました。プリズムタイプのみを使用するようにサンプルを更新します。 –
ああ、プリズム・イベンティング(疎結合のイベント)を使うほうが良いかもしれないのだろうかと思うので、バインドを心配する必要はありませんか? – Sam