45

我在使用 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'

我错过了什么?

4

3 回答 3

90

我相信这会奏效:

_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();
}
于 2011-03-14T13:14:26.740 回答
4

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

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

于 2011-03-14T13:14:50.640 回答
2

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

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

public void ExecuteChartCommand(string vendor)
{

}
于 2012-11-12T11:26:43.253 回答