2011-03-14 125 views
39

我在使用GalaSoft MVVM Light框架将参数传递给relaycommand时遇到了问题。我知道MVVM光的实现relaycommand的不使用拉姆达参数,所以我做了一些研究,发现了一种方法,人们围绕它的工作做这样的事情:MVVM Light RelayCommand参数

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'

我错过了什么?

回答

76

我相信这将工作:

_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(); 
} 
+0

我以前看到这一点,已经尝试过了,但它看起来像GalaSoft的RelayCommand不包含RelayCommand 实现?当我尝试RelayCommand时出现这个错误:无法隐式地将类型'GalaSoft.MvvmLight.Command.RelayCommand '转换为'GalaSoft.MvvmLight.Command.RelayCommand' – Saggio 2011-03-14 13:30:34

+0

Gah,我试图编辑,但为时已晚......忽视以前的评论,我忘了改变_projmenuItem_Edit键入RelayCommand :p – Saggio 2011-03-14 13:36:56

+2

我更新了答案,以及其他任何人遇到此问题。 :) – Robaticus 2011-03-14 13:38:14

4

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

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

1

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

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

public void ExecuteChartCommand(string vendor) 
{ 

} 
相关问题