【问题标题】:WPF MenuItem ViewModel CommandWPF 菜单项视图模型命令
【发布时间】:2010-04-30 12:39:28
【问题描述】:

我对 WPF 相当陌生,并且在一个场景中有点挣扎。我有一个包含菜单项的菜单。当单击这些菜单项之一时,需要调用一个方法,该方法将根据与该菜单项关联的显示文本执行某些操作。例如,菜单项的内容是“测试”,所以我需要对“测试”做一些事情。仅供参考,这个“东西”直接影响 ViewModel 上的集合。

这很容易使用点击事件和没有 ViewModel 来实现,但我试图使用显式 ViewModel 来实现 MVVM。所以我开始研究命令,但看不到如何将视图中的任何内容传递回视图模型中的命令。

对我应该在这里做什么有什么建议吗?

谢谢

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    鉴于您有一系列推动指挥的项目,我建议您使用类似于 Will 的第二个建议的东西,如下所示:

    <MenuItem
      Command="{Binding MenuCommand}"
      CommandParameter="{Binding}"
      Header="{Binding DisplayText}" />
    

    在 ViewModel 方面,您可以使用 DelegateCommand 或 RelayCommand 来连接您的处理程序方法。这使您可以检查菜单项的数据并根据其中的内容执行所需的任何操作。

    public DelegateCommand<MyMenuObject> MenuCommand { get; private set; }
    
    public ViewModel()
    {
        MenuCommand = new DelegateCommand<MyMenuObject>(MenuCommandExecuted);
    }
    
    public void MenuCommandExecuted(MyMenuObject parameter)
    {
        // do something based on the parameter object
    }
    

    您还需要将 MenuCommand 传递给集合项的 ICommand 属性以使用上面的简单绑定表单,或者更改命令绑定以使用 RelativeSource FindAncestor 之类的东西来查找树到父级的 DataContext (ViewModel)对于菜单命令。使用这种方法,您可以灵活地从集合中添加或删除项目,而无需进行任何 UI 更改来支持新的项目集。

    Prism DelegateCommand

    RelayCommand

    【讨论】:

      【解决方案2】:

      你有两个选择。

      1. 为每个菜单命令公开一个 ICommand,例如“FileCommand”、“EditCommand”、“SaveCommand”等。
      2. 使用CommandParameter 将信息发送回Command,例如

        <MenuItem Command="{Binding MenuCommand}" CommandParameter="File">File</MenuItem>
        

      我认为第一个选项更好,因为它避免了魔术字符串。

      【讨论】:

      • 好的,谢谢您的回复。我忘了提到菜单项显示的文本也绑定到 ViewModel,即 ObervableCollection。这肯定会排除No.2。我不确定我是否完全理解 No.1?我创建了一个实现 ICommand 接口的命令,但是包含的文本如何传递给命令?再次感谢
      猜你喜欢
      • 2023-03-09
      • 2014-05-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2016-06-18
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多