在我的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
&amp; 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
方法),但我想保持这两个部分相对分离。
有什么明显的东西我不见了,我是以错误的方式解决这个问题,还是有人有任何其他建议?
由于
答案 0 :(得分:0)
已解决的排序 - 我现在通过MenuCommandService
方法手动将右键单击的节点传递给我的ReloadICommandConditions()
,并且它持有对它的本地引用,然后它在CanExecute()方法中使用而不是参数。原油,但至少它有效。
如果有人知道一种更优雅的方式,我会暂时保持这种状态。