上下文菜单打开时不会引发CanExecute

时间:2016-06-23 09:58:08

标签: c# wpf contextmenu relaycommand canexecute

我知道有一些相关的问题,但没有一个能帮助我找到问题。

大多数答案建议将CanExecuteChanged实施为shown in this answer。嗯,这不是我的问题的解决方案。我有一个类似于Josh Smith's implemenation的RelayCommand实现。 (类似,因为我们的实现添加了更多细节,但核心实现是相同的。)

在搜索互联网时我还了解到,如果没有聚焦元素,路由将停在ContextMenu并且不会到达MenuItem。一种有助于这种情况的解决方案is shown here 但是,我检查了Snoop是否确实没有任何重点元素并且了解到这不是问题。无论如何,修复无济于事 此外,我在测试项目中模拟了该问题,并且能够修复它。因此修复通常有效,它只是没有帮助我。但是,我认为仍然有机会稍微调整修复程序以使其正常工作。我尝试使用MyControl代替ContextMenu作为AncestorType,我尝试PlacementTarget.Tag而不仅仅PlacementTarget作为Path,但我不知道还有什么可以尝试获得它工作(假设这是错误)。

有趣的是,当我手动调用CommandManager.InvalidateRequerySuggested()时,它甚至不起作用。我添加了一个在ContextMenuOpening上引发的命令。我认为这会强制执行CanExecute但似乎我错了。

所以,我现在正在寻找进一步的原因,为什么在打开ContextMenu时不会引发CanExecute处理程序以及如何解决这个问题。

这是我的XAML代码(包括EventTrigger的{​​{1}}):

ContextMenuOpening

以下是<MyControl> <MyControl.ContextMenu> <ContextMenu> <MenuItem Header="..." Command="{Binding MyCommand}" CommandParameter="{Binding}" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/> </ContextMenu> </MyControl.ContextMenu> <i:Interaction.Triggers> <i:EventTrigger EventName="ContextMenuOpening"> <i:InvokeCommandAction Command="{Binding OnContextMenuOpening}" /> </i:EventTrigger> </i:Interaction.Triggers> </MyControl> 和(Can)执行处理程序的定义:

MyCommand

这是我的internal static readonly ICommandEx MyCommand = new RelayCommand(OnMyCommand, OnCanMyCommand); private static void OnMyCommand(object parameter) { ... } private static bool OnCanMyCommand(object parameter) { ... } 处理程序,我试图强制OnContextMenuOpening的CanExecute被提升:

MyCommand

1 个答案:

答案 0 :(得分:0)

您在OnContextMenuOpening控件上错误地收听了ContextMenu。它永远不会射击!相反,请在您的MyControl控件上监听此事件。