使用隧道,而不是气泡的RoutedCommands(RoutedCommands that use

2019-09-23 12:29发布

我有一个自定义控制( MyControl暴露的自定义命令)。 我希望父Window才能够调用此命令,所有MyControls应该对其做出反应。

我已经添加了命令MyControlCommandBindings收藏,这也提供了一个CanExecute回调总是返回true。

我的问题是,从来没有调用此命令的菜单项被启用。 我假定这是因为菜单是上述MyControls在视觉树,但说实话,我对如何有点模糊RoutedUICommand的范围内工作的。

有人能解释我做错了什么,或者如果这甚至有可能?

Answer 1:

是的,问题是,您的自定义命令是的CommandBinding在视觉树比你的菜单项。 从MSDN

当在所述的RoutedCommand方法CanExecute被调用时,PreviewCanExecute事件引发的命令目标。 如果不处理该事件时,CanExecute事件引发。 如果命令目标具有的命令的CommandBinding,对于在的CommandBinding处理CanExecute被调用。 如果命令目标不具有该命令的CommandBinding的CanExecute事件冒泡的元素树寻找具有与命令相关联的一个的CommandBinding元素。

有关命令一篇很好的文章,在这个环节 。

反正你可以使用CommandTarget命令从你的菜单项,如

<MenuItem Header="Click me"  Command="local:CommandClass.MyCustomCommand" CommandTarget="{Binding ElementName=myCustomCtrl}" />

以这种方式,特定的命令源(菜单项)指示该命令的特定目标(定制控制的实例)。



Answer 2:

我猜命令是错误的意思在这里。

命令用于捆绑不同的命令触发源到一个命令处理程序。 所以命令是从不同的控件,菜单,引发...但相同的命令处理程序被调用。

活动有几分opposit的。 一个来源可以触发多个事件处理程序。

在你的特殊情况,我宁愿一个事件,您的用户界面树下面的控制会比听隧道事件或冒泡事件。



文章来源: RoutedCommands that use tunneling instead of bubbling