我遇到使用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'
行上一直收到错误消息
我错过了什么?
答案 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)
{
}