我目前正在学习 WPF 和 MVVM,我想我掌握了大部分内容以及它是如何工作的,但是我在使用 RelayCommand(或 DelegateCommand)时遇到了一些我不理解的东西。我认为这与代表的工作方式有关。
请注意,下面的代码目前都只是在测试解决方案中,所以没有实时代码。此外,我正在考虑对不需要诸如 close 之类的参数的命令进行此操作,并了解其工作原理。
因此,如果我采用 Josh Smith 创建的 RelayCommand(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030),我可以设置如下命令:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
使用此执行方法:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
我使用一个简单的绑定到 TextBlock 来查看结果,并且命令绑定到一个按钮。这工作正常。我没有得到的是使用 lambda 表达式来创建命令。期望一个Action<object>
参数不是吗?那么为什么这段代码有效呢?
如果我将上面的代码更改为
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
我收到这些错误:
*“MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand(System.Action)”的最佳重载方法匹配有一些无效参数
参数 1:无法从 'void' 转换为 'System.Action'*
并删除()
after Execute 给出此错误:
参数 1:无法从“方法组”转换为“System.Action”
但是,如果我像这样更改代码:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent = DateTime.Now.ToString();
}
它符合并运行良好。如果我将视图更改为使用 CommandParameter 我可以使用 param 使用此方法设置文本内容,但如果我使用 lambda 样式,我必须将参数传递给该行,因此它就像这样 param => this.UpdateTextContentCommand_Execute(param)
。
在我的测试中,我对 CommandParameter 值进行了硬编码,但我猜它很可能是绑定到真实系统中 ViewModel 属性的数据,因此您可以以 lambda 样式传递参数。
谁能解释一下为什么无参数版本适用于 lambda 样式?
感谢您抽时间阅读。
下面的问题似乎也有一些关于 lambda 的问题,但我没有看到它回答了我的问题。