我知道有几个相关问题,但是这些问题都没有帮助我找到问题。
大多数答案建议实现canecutechanged,如本答案所示。好吧,那不是解决我的问题的方法。我已经实施了类似于乔什·史密斯(Josh Smith)的插入的接力司令。(类似,因为我们的实施添加了更多详细信息,但核心实施是相同的。)
在搜索互联网时,我还了解到,如果没有重点元素,该路由将停在上下文中,并且不会到达Menuitem。在此处显示的一种解决方案。
但是,我检查了Snoop是否确实没有任何重点元素,并且了解到这不是问题。而且修复程序无济于事。
此外,我在测试项目中模拟了这个问题,并能够修复它。因此,修复程序通常有效,只是没有帮助我。但是,我认为仍然有机会稍微调整修复程序才能使其正常工作。我尝试了MyControl
而不是ContextMenu
作为祖先类型,但我尝试了PlacementTarget.Tag
,而不是PlacementTarget
作为Path
,但我不知道该尝试使它起作用了(假设这是错误)。
有趣的是,当我致电CommandManager.invalidaterequerysuggested()手动时,它甚至行不通。我添加了一个在上下文模型上提出的命令。我认为这会迫使canecute被执行,但看来我误会了。
所以,我现在正在寻找进一步的原因,为什么打开ContextMenu以及如何修复CanExecute
处理程序。
这是我的XAML代码(包括EventTrigger
的CC_7):
<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>
这是MyCommand
的定义和(CAN)执行处理程序:
internal static readonly ICommandEx MyCommand =
new RelayCommand(OnMyCommand, OnCanMyCommand);
private static void OnMyCommand(object parameter) { ... }
private static bool OnCanMyCommand(object parameter) { ... }
这是我的OnContextMenuOpening
处理程序,我试图强制MyCommand
的canexecute升级:
private static void OnContextMenuOpening(object parameter)
{
CommandManager.InvalidateRequerySuggested();
}
您在ContextMenu
控件上的OnContextMenuOpening
上错误地侦听。它永远不会开火!相反,请在MyControl
控件上听此事件。