Window中的CommandBinding不会捕获ContextMenu的命令执行

时间:2009-05-26 17:53:24

标签: wpf command

一个非常简单明了的例子。

我有一个窗口。它将CommandBindings设置为捕获RoutedUICommand执行。

<Window
   ...
   >
   <Window.CommandBinding>
       <CommandBinding 
           Command="{x:Static local:Commands.Command1}"  
           Executed="OnCommand1Executed" 
           CanExecute="OnCanCommand1Execute" 
           />
   </Window.CommandBinding>
</Window>

在窗口中托管了一个UserControl,其中声明了ContextMenu。 ContextMenu项具有分配给相同RoutedUICommand的Command属性。

<ContextMenu>
    <MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>

但菜单项保持不活动状态(==禁用)。不知何故,命令执行没有进入窗口。也许是因为ContextMenu在弹出窗口内?

如果我将所需的CommandBinding添加到ContextMenu.CommandBindings集合中,一切正常。但是,如果没有一个“全局”CommandBinding的地方,这是一个可怕的选择。

如何以最佳方式解决问题?

UPD:原来并没有那么糟糕。仅在第一次用户打开菜单时,命令才会绑定。如果关闭并重新打开,一切都很好。不过,这似乎是不可取的,也是一种非常奇怪的行为。

2 个答案:

答案 0 :(得分:4)

如果添加Focus(),是否仍会发生这种情况;就在InitializeComponent()之后;在windows构造函数中?

这听起来像WPF在从上下文菜单中找到可视树时遇到问题。将焦点设置到主窗口可能会修复它。

答案 1 :(得分:1)

我们如何在用户控件中处理此问题?似乎焦点在那种情况下不起作用

更新:我在How to set CommandTarget for MenuItem inside a ContextMenu?

找到了解决方案

似乎它与CommandTarget

有关
<MenuItem x:Name="mnuProperties" Header="_Properties"
          Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}"
          CommandTarget="{Binding PlacementTarget,
          RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>