我是WPF的新手,我正在努力解决一个场景。我有一个菜单项目。当单击其中一个菜单项时,需要调用一个方法,该方法将根据与该菜单项关联显示的文本执行某些操作。因此,例如,菜单项的内容是“测试”,所以我需要做一些“测试”。仅供参考,这个“东西”直接影响ViewModel上的一个集合。
使用click事件并没有ViewModel很容易实现,但我尝试使用显式ViewModel实现MVVM。所以我开始研究命令,但看不到我如何将View中的任何内容传递回ViewModel中的命令。
关于我应该在这里做什么的任何建议?
由于
答案 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更改以支持新的项目集。
答案 1 :(得分:2)
你有两个选择。
使用CommandParameter将信息发送回命令,例如
<MenuItem Command="{Binding MenuCommand}" CommandParameter="File">File</MenuItem>
我认为第一种选择更好,因为它避免了魔术字符串。