我知道有一些相关的问题,但没有一个能帮助我找到问题。
大多数答案建议将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
答案 0 :(得分:0)
您在OnContextMenuOpening
控件上错误地收听了ContextMenu
。它永远不会射击!相反,请在您的MyControl
控件上监听此事件。