【问题标题】:MVVM Light RelayCommand ParametersMVVM Light RelayCommand 参数
【发布时间】:2011-03-14 13:02:22
【问题描述】:

我在使用 GalaSoft MVVM Light 框架将参数传递给中继命令时遇到问题。我知道 mvvm light 的 relaycommand 实现不使用 lambda 参数,所以我做了一些研究并找到了一种方法,人们可以通过以下方式解决它:

public RelayCommand ProjMenuItem_Edit
{
    get
    {
        if (_projmenuItem_Edit == null)
        {
            //This should work....
            _projmenuItem_Edit = new RelayCommand(ProjEditNode);
        }
        return _projmenuItem_Edit;
    }
}

private void ProjEditNode(object newText)
{
    var str = newText as string;
    OrganLocationViewModel sel = 
        ProjectOrganLocationView.GetExtendedTreeView().GetTopNode();

    //Console.WriteLine(sel.OrganDisplayName);
    sel.OrganDisplayName = str;
}

但是,我在_projmenuItem_Edit = new RelayCommand(ProjEditNode); 行上不断收到错误消息,上面写着Argument 1: cannot convert from 'method group' to 'System.Action'

我错过了什么?

【问题讨论】:

    标签: c# wpf mvvm-light relaycommand


    【解决方案1】:

    我相信这会奏效:

    _projmenuItem_Edit = new RelayCommand<object>((txt)=>ProjEditNode(txt));
    

    -- 编辑--

    您还需要使用类型定义 RelayCommand:

    例如

    public RelayCommand<string> myCommand { get; private set; }
    myCommand = new RelayCommand<string>((s) => Test(s));
    
    private void Test(string s)
    {
        throw new NotImplementedException();
    }
    

    【讨论】:

    • 我以前见过这个并尝试过,但看起来 GalaSoft 的 RelayCommand 不包含 RelayCommand 实现?尝试 RelayCommand 时出现此错误:无法将类型 'GalaSoft.MvvmLight.Command.RelayCommand' 隐式转换为 'GalaSoft.MvvmLight.Command.RelayCommand'
    • 呸,我尝试编辑但为时已晚...忽略前面的评论,我也忘记将 _projmenuItem_Edit 更改为键入 RelayCommand :p
    • 我也更新了答案,对于其他遇到此问题的人。 :)
    • 一个(不重要的)注释 - new RelayCommand((txt)=>ProjEditNode(txt)) 可以只是 new RelayCommand(ProjEditNode) - .NET 知道如何解决该方法以及传递给它的参数。
    • 方法组也应该可以工作:myCommand = new RelayCommand(Test);
    【解决方案2】:

    我不认为RelayCommand() 有一个非空的构造函数。您试图将错误的方法传递给它。

    如果您希望 RelayCommand 支持命令参数,您应该使用 RelayCommand&lt;T&gt; 其中 T 可以是任何类型的参数。在您的情况下,RelayCommand&lt;String&gt; 将接受带有 void(string) 签名的方法。 (因此也将是强类型的,不会使用丑陋的对象)

    【讨论】:

      【解决方案3】:

      另一种声明中继命令的方式,将有助于减少代码

      public RelayCommand ChartCommand
      {
          set
          {
              RelayCommand<string> chartCommand = 
                  new RelayCommand<string>(e => ExecuteChartCommand(e));               
          }
      }
      
      public void ExecuteChartCommand(string vendor)
      {
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多