WPF菜单项视图模型命令

3
我对WPF还比较陌生,现在遇到了一个问题。我有一个菜单,其中包含菜单项。当单击其中一个菜单项时,需要调用一个方法,该方法将根据与该菜单项关联的文本执行某些操作。例如,菜单项的内容为“测试”,因此我需要处理“测试”。请注意,“某些操作”直接影响ViewModel上的集合。
使用点击事件且没有ViewModel很容易实现,但是我尝试使用显式ViewModel来实现MVVM。因此,我开始研究命令,但是不知道如何将任何内容从View传回ViewModel中的命令。
你们有什么建议吗?
谢谢
2个回答

5
鉴于您拥有一系列驱动命令的项目,我建议使用类似于威尔第二个建议的东西,如下所示:
<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)中的MenuCommand。使用这种方法可以使您灵活地向集合中添加或删除项目,而无需进行任何UI更改以支持新的项目集。 Prism DelegateCommand RelayCommand

2
你有两个选择。
  1. Expose an ICommand for each menu command, such as "FileCommand", "EditCommand", "SaveCommand", etc.
  2. Use the CommandParameter to send information back to the Command, such as

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

我认为第一种选择更好,因为它避免了神奇的字符串。


好的,谢谢回复。我忘了提到菜单项显示的文本也绑定到了ViewModel上,即一个ObservableCollection。这肯定排除了第二种情况。我不确定我完全理解第一种情况?我创建了一个实现ICommand接口的命令,但是文本如何传递给命令?再次感谢。 - Jon Archway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接