Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WPF MenuItem ViewModel命令_.net_Wpf_Mvvm - Fatal编程技术网

.net WPF MenuItem ViewModel命令

.net WPF MenuItem ViewModel命令,.net,wpf,mvvm,.net,Wpf,Mvvm,我是WPF的新手,正在为一个场景而挣扎。我有一份菜单,上面有菜单项。单击其中一个菜单项时,需要调用一个方法,该方法将根据与该菜单项关联的显示文本执行某些操作。例如,菜单项的内容是“test”,所以我需要用“test”做一些事情。仅供参考,此“某物”直接影响ViewModel上的集合 使用click事件和no-ViewModel很容易实现,但我尝试使用显式ViewModel实现MVVM。因此,我开始研究命令,但看不到如何将任何内容从视图传递回ViewModel中的命令 对我应该在这里做什么有什么建

我是WPF的新手,正在为一个场景而挣扎。我有一份菜单,上面有菜单项。单击其中一个菜单项时,需要调用一个方法,该方法将根据与该菜单项关联的显示文本执行某些操作。例如,菜单项的内容是“test”,所以我需要用“test”做一些事情。仅供参考,此“某物”直接影响ViewModel上的集合

使用click事件和no-ViewModel很容易实现,但我尝试使用显式ViewModel实现MVVM。因此,我开始研究命令,但看不到如何将任何内容从视图传递回ViewModel中的命令

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

谢谢你有两个选择

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

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

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

    鉴于你有一系列的物品驱动命令,我建议你使用类似于威尔第二个建议的东西,如下所示:

    <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
    }
    
    public DelegateCommand MenuCommand{get;private set;}
    公共视图模型()
    {
    MenuCommand=newdelegateCommand(MenuCommandExecuted);
    }
    public void menucommandexed(MyMenuObject参数)
    {
    //基于参数对象执行某些操作
    }
    
    您还需要将MenuCommand传递到集合项上的ICommand属性中,以使用上面的简单绑定表单,或者更改命令绑定以使用类似RelativeSource FindAncestor的内容,或者在树中查找MenuCommand的父级数据上下文(ViewModel)。使用这种方法,您可以灵活地从集合中添加或删除项,而无需进行任何UI更改以支持新的项集


    好的,谢谢你的回复。我忘了提到菜单项显示的文本也绑定到ViewModel,即ObervableCollection。这当然排除了第二种可能性。我不确定我是否完全理解第一条?我创建了一个实现ICommand接口的命令,但是如何将包含的文本传递给该命令呢?再次感谢