在我的 WPF 应用程序中,我有一种节点图。我已经ContextMenu
向这些节点添加了一个,当我右键单击东西时会出现等等。
上下文菜单中的命令来自带有 的服务 ( Microsoft.Practices.ServiceLocation.ServiceLocator
) DelegateCommands
,并且这些命令使用 更新RaiseCanExecuteChanged()
。被右键单击的节点被传递给这个命令服务,该服务用于CanExecute
命令的各种方法中。
节点都有一些在这些条件下使用的属性,比如是否可以重命名或删除等。
private void ContextMenu_ContextMenuOpening(object sender, RoutedEventArgs e) {
ServiceLocator.Current.GetInstance<IMenuCommandService>().ReloadICommandConditions();
}
在 IMenuCommandService 中:
public void ReloadICommandConditions() {
((DelegateCommand<Node>) MyCommand).RaiseCanExecuteChanged();
}
我的 ContextMenu (在DataTrigger
&内Setter
):
<ContextMenu>
<MenuItem Header="Rename"
Command="{Binding MenuCommandService.Rename}"
CommandParameter="{Binding Node}" />
<MenuItem Header="Delete"
Command="{Binding MenuCommandService.Delete}"
CommandParameter="{Binding Node}" />
...
</ContextMenu>
我的问题是,当我右键单击其中一个节点时,显示的上下文菜单看起来像是为先前选择的节点配置的。就像我右键单击一个可删除的节点,然后是一个不可删除的节点,上下文菜单上的“删除”命令仍然是可单击的。(如果我然后右键单击不可删除的节点,则上下文菜单将正确,并且“删除”命令显示为灰色。)
RaiseCanExecuteChanged()
因此,从上下文菜单“拾取”之后所做的更改实际上存在某种延迟。我可以做一个粗略的修复,只在它们更新后才显示上下文菜单(即它们的CanExecute
方法已被调用),但我想保持这两个部分相对分开。
Is there something obvious I'm missing, am I going about this in the wrong way, or does anyone have any other suggestions?
Thanks