3つのオプションがあります。
1)CommandBindingを登録して、通常のイベントの代わりに、または通常のイベントに加えてプレビューイベントを処理できます。
CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll);
cb.PreviewCanExecute += OnCanExecuteSelectAll;
cb.PreviewExecuted += OnExecutedSelectAll;
ただし、注意してください。PreviewExecutedを登録している場合、CommandBindingを介してハンドラーを登録すると、e.Handledをfalseに明示的に設定しても、Executedハンドラーは実行されません。ただし、PreviewCanExecute/CanExecuteのイベントのペアでは期待どおりに機能します。これは、CommandBindingクラスを実装する方法です。
したがって、基本クラスのコマンドハンドラーを実行したくない場合にのみ、PreviewExecutedを使用してください。
2)または、CommandManagerを介してコマンドハンドラーを直接登録することもできます。
CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll);
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll);
ただし、これはクラスハンドラーではないため、インスタンスごとに実行する必要があります。次に、ハンドラーで天気を確認する必要があります。これは、関心のあるコマンドです(イベント引数にコマンドへの参照があります)。注:引き続きCommandBindingを登録する必要がありますが、CommandManagerに直接ハンドラーを追加するだけの場合は、そのCommandBindingにハンドラーを登録する必要はありません。
3)または、少しハックすることもできます(実際にはハックではありません):
this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true);
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true);
このようにして、コマンドイベントハンドラーを登録して、既に処理されている場合でも実行されるようにします。
上記のポイントと同様に、CommandManagerイベントを発生させるには、コマンドバインディングを登録する必要があります。
これは、上記のポイント2とほぼ同じですが、CommandManager.Add[4つのイベントの1つ]Handlerを呼び出すと、コマンドマネージャーは2つの引数バージョンを使用してコントロールのAddHandlerを呼び出します。