【问题标题】:RoutedCommands that use tunneling instead of bubbling使用隧道而不是冒泡的 RoutedCommands
【发布时间】:2012-10-04 11:28:34
【问题描述】:

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

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

我的问题是调用此命令的菜单项永远不会启用。我推测这是因为菜单在可视化树中的 MyControls 上方,但老实说,我对 RoutedUICommand 的作用域的工作原理有点模糊。

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

【问题讨论】:

    标签: c# wpf command routed-commands tunneling


    【解决方案1】:

    是的,关键是您的自定义命令的 CommandBinding 低于可视树中的菜单项。来自msdn

    当调用 RoutedCommand 上的 CanExecute 方法时,会在命令目标上引发 PreviewCanExecute 事件。如果未处理该事件,则会引发 CanExecute 事件。如果命令目标具有该命令的 CommandBinding,则调用该 CommandBinding 的 CanExecute 处理程序。 如果命令目标没有命令的 CommandBinding,CanExecute 事件会在元素树中冒泡,搜索具有与命令关联的 CommandBinding 的元素。

    at this link 中关于命令的非常好的文章。

    无论如何,您都可以从菜单项中使用 CommandTarget 命令,例如

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

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

    【讨论】:

    • 不幸的是,我需要 MyControl 的所有实例来响应,而不仅仅是一个,所以 CommandTarget 对我没用。已标记您的答案,因为您已确认这是不可能的。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多