5

在我的 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

4

1 回答 1

0

Sort-of-solved -- I'm now manually passing the node that was right-clicked on to my MenuCommandService through that ReloadICommandConditions() method, and it's holding a local reference to it, which it then uses instead of the parameter in its CanExecute() methods. Crude, but at least it works.

I'll keep this open for now in case anyone knows of a way that's a bit more... elegant.

于 2012-10-12T10:55:01.940 回答