【问题标题】:RaiseCanExecuteChanged delay with ContextMenuRaiseCanExecuteChanged 延迟与 ContextMenu
【发布时间】: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(在 DataTriggerSetter 内):

<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 提供:&lt;MenuItem Header="Rename" Command="{Binding MenuCommandService.Rename}" CommandParameter="{Binding Node}" /&gt;。当上下文菜单中的实际项目被点击时,这个参数被正确提供,但在它第一次打开时却不是。

标签: c# wpf mvvm contextmenu prism


【解决方案1】:

Sort-of-solved -- 我现在通过ReloadICommandConditions() 方法手动将右键单击的节点传递给我的MenuCommandService,并且它持有对它的本地引用,然后使用它来代替CanExecute() 方法中的参数。粗制滥造,但至少它有效。

我暂时保持开放,以防有人知道更...优雅的方式。

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2013-07-25
    • 2012-01-24
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多