WPF MenuItem ViewModel命令

时间:2010-04-30 12:39:28

标签: .net wpf mvvm

我是WPF的新手,我正在努力解决一个场景。我有一个菜单项目。当单击其中一个菜单项时,需要调用一个方法,该方法将根据与该菜单项关联显示的文本执行某些操作。因此,例如,菜单项的内容是“测试”,所以我需要做一些“测试”。仅供参考,这个“东西”直接影响ViewModel上的一个集合。

使用click事件并没有ViewModel很容易实现,但我尝试使用显式ViewModel实现MVVM。所以我开始研究命令,但看不到我如何将View中的任何内容传递回ViewModel中的命令。

关于我应该在这里做什么的任何建议?

由于

2 个答案:

答案 0 :(得分:5)

鉴于你有一系列推动指挥的物品,我建议使用与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属性,以使用上面的简单Binding表单或更改命令绑定以使用类似于RelativeSource FindAncestor的内容来查找父树的DataContext(ViewModel)对于MenuCommand。使用此方法可以灵活地添加或删除集合中的项目,而无需进行任何UI更改以支持新的项目集。

Prism DelegateCommand

RelayCommand

答案 1 :(得分:2)

你有两个选择。

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

    <MenuItem Command="{Binding MenuCommand}" CommandParameter="File">File</MenuItem>
    
  3. 我认为第一种选择更好,因为它避免了魔术字符串。