3

我有一个自定义控件 ( MyControl),它公开了一个自定义命令。我希望父母Window能够调用这个命令,并且所有人都MyControls应该对它做出反应。

我已将该命令添加到MyControlCommandBindings集合中,该集合还提供了一个CanExecute始终返回 true 的回调。

我的问题是调用此命令的菜单项永远不会启用。我假设这是因为菜单MyControls在可视树的上方,但老实说,我对RoutedUICommand' 范围的确切工作方式有点模糊。

有人可以澄清我做错了什么,或者这是否可能?

4

2 回答 2

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}" />

以这种方式,特定的命令源(菜单项)将命令定向到特定的目标(自定义控件的实例)。

于 2012-10-04T13:16:11.910 回答
1

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

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

事件有点相反。一个源可以触发多个事件处理程序。

在您的特殊情况下,我更喜欢一个事件,并且您的 UI 树下的控件将比听隧道事件或冒泡事件。

于 2013-01-31T09:07:56.723 回答