Pyr*_*tie 5 c# wpf prism contextmenu mvvm
在我的WPF应用程序中,我有一种节点图.我已经ContextMenu向这些节点添加了一个,当我右键单击东西时出现,等等.
上下文菜单中的命令来自Service(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方法被调用),但我想,以保持两个部分相对独立的.
有什么明显的东西我不见了,我是以错误的方式解决这个问题,还是有人有任何其他建议?
谢谢
已解决 - 我现在MenuCommandService通过该ReloadICommandConditions()方法手动将右键单击的节点传递给我,并且它持有对其的本地引用,然后使用该引用代替其 CanExecute() 方法中的参数。粗糙,但至少有效。
我现在将保持开放状态,以防有人知道一种更......优雅的方式。
| 归档时间: | 
 | 
| 查看次数: | 276 次 | 
| 最近记录: |