【发布时间】:2012-10-11 11:43:34
【问题描述】:
在我的 WPF 应用程序中,我有一种节点图。我在这些节点上添加了一个ContextMenu,当我右键单击东西等时会出现。
上下文菜单中的命令来自带有 DelegateCommands 的服务 (Microsoft.Practices.ServiceLocation.ServiceLocator),并且这些命令使用 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>
我的问题是,当我右键单击这些节点之一时,显示的上下文菜单看起来像是为选择的 previous 节点配置的。就像我右键单击一个可删除的节点,然后是一个不可删除的节点,上下文菜单上的“删除”命令仍然是可单击的。 (如果我然后右键单击不可删除的节点,则上下文菜单将正确,并且“删除”命令显示为灰色。)
所以看起来在RaiseCanExecuteChanged() 之后所做的更改实际上存在于上下文菜单以“拾取”时存在某种延迟。我可以做一个粗略的修复,只在更新后显示上下文菜单(即他们的 CanExecute 方法已被调用),但我想保持这两个部分相对分开。
我有什么明显的遗漏吗,我是否以错误的方式处理这个问题,或者有没有人有任何其他建议?
谢谢
【问题讨论】:
-
您是否调试过任何命令的 CanExecute() 并检查那里的条件?我不认为这是一个延迟问题,但它将是您在 CanExecute 中检查的条件值,例如 currentSelectedNode 或其他东西。调用 ContextMenuOpening 时,您的 SelectedNode 可能仍然是前一个?
-
@Kroax CanExecute() 方法的参数由 ContextMenu 提供:
<MenuItem Header="Rename" Command="{Binding MenuCommandService.Rename}" CommandParameter="{Binding Node}" />。当上下文菜单中的实际项目被点击时,这个参数被正确提供,但在它第一次打开时却不是。
标签: c# wpf mvvm contextmenu prism