你有三个选择:
1)您可以注册您的CommandBinding处理预览事件,而不是或除了常规的事件:
CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll);
cb.PreviewCanExecute += OnCanExecuteSelectAll;
cb.PreviewExecuted += OnExecutedSelectAll;
但要小心 - 通过的CommandBinding注册处理程序时,如果你具有PreviewExecuted注册,即使您明确地将e.Handled设置为false,Executed处理程序也不会运行。它确实按照预期的方式为PreviewCanExecute/CanExecute事件对工作。这是CommandBinding类实现的方式。
因此,仅当您不希望基类命令处理程序运行时才使用PreviewExecuted。
2)或者,您也可以直接通过命令管理器注册您的命令处理程序:
CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll);
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll);
这是不是一类的处理程序,但这样你需要做的是为每个实例。然后在你的处理程序中,你需要检查天气这是你感兴趣的命令(在事件参数中有一个对命令的引用)。注意:你仍然需要注册CommandBinding,但是如果你只想在CommandManager上直接添加处理程序 - 你不需要使用那个Command Binding来注册任何处理程序。
3),或者你可以做一个黑客攻击的一位(不是一个真正的黑客):
this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true);
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true);
这样您注册指挥事件处理程序,使他们即使他们已经处理被执行。
与上面一样,您需要注册命令绑定,才能触发CommandManager事件。
这几乎与上面第2点中的相同,但是当您调用CommandManager.Add [四个事件之一] Handler时 - 命令管理器使用两个参数版本在控件上调用AddHandler。