我目前正在學習WPF和MVVM,我想我得到它的大部分和它是如何工作的,但我遇到了使用RelayCommand(或DelegateCommand)的東西,我不明白。我認爲這與代表們的工作方式有關。繼電器命令和無參數執行方法
請注意下面的代碼目前都在測試解決方案中,所以沒有實時代碼。另外我正在考慮這個不需要像close這樣的參數的命令,並且理解它爲什麼起作用。
所以,如果我走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:無法從「空」到「System.Action」 *
和取出()
轉換後執行給出了這樣的錯誤:
參數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樣式,我必須將一個參數傳遞給該行,所以它的參數=>this.UpdateTextContentCommand_Execute(param)
。
在我的測試中,我對CommandParameter值進行了硬編碼,但我想它很可能是數據綁定到實際系統中的ViewModel的屬性,因此您可以在lambda樣式中傳遞該參數。
任何人都可以解釋爲什麼無參數版本使用lambda樣式嗎?
感謝您花時間閱讀本文。
看來下面的問題也有關於lambda的一些問題,但我沒有看到它回答了我的問題。
Passing a parameter using RelayCommand defined in the ViewModel (from Josh Smith example)
+1爲證明你已經嘗試過的東西了詳細的問題。 – 2012-08-05 12:54:24
乾杯。當我發現問題時,我總是努力並付出努力,因爲我在尋找答案時發現了有用的問題。 – Kioshiki 2012-08-05 12:59:24