MVVM Light RelayCommand参数

时间:2011-03-14 13:02:22

标签: c# wpf mvvm-light relaycommand

我遇到使用GalaSoft MVVM Light框架将参数传递给relaycommand的问题。我知道mvvm light的relay命令的实现不使用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'行上一直收到错误消息

我错过了什么?

3 个答案:

答案 0 :(得分:79)

我相信这会奏效:

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

- 编辑 -

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

e.g。

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

private void Test(string s)
{
    throw new NotImplementedException();
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

声明中继命令的另一种方法是帮助减少代码

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

public void ExecuteChartCommand(string vendor)
{

}