使用ContextMenu进行RaiseCanExecuteChanged延迟

时间:2012-10-11 11:43:35

标签: c# wpf mvvm contextmenu prism

在我的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方法),但我想保持这两个部分相对分离。

有什么明显的东西我不见了,我是以错误的方式解决这个问题,还是有人有任何其他建议?

由于

1 个答案:

答案 0 :(得分:0)

已解决的排序 - 我现在通过MenuCommandService方法手动将右键单击的节点传递给我的ReloadICommandConditions(),并且它持有对它的本地引用,然后它在CanExecute()方法中使用而不是参数。原油,但至少它有效。

如果有人知道一种更优雅的方式,我会暂时保持这种状态。