Polecenie relatywne i metoda wykonywania bez parametrów
Obecnie uczę się WPF i MVVM, myślę, że dostaję większość tego i jak to działa, ale natknąłem się na coś na temat używania RelayCommand (lub DelegateCommand), którego nie rozumiem. Myślę, że ma to związek ze sposobem pracy delegatów.
Pamiętaj, że poniższy kod jest w tej chwili tylko testem rozwiązań, więc nie ma kodu na żywo. Rozważam to również w przypadku poleceń, które nie wymagają parametru, takiego jak close, i zrozumienia, dlaczego to działa.
Więc jeśli wezmę RelayCommand, to Josh Smith stworzył (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) Mogę skonfigurować takie polecenie:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
za pomocą tej metody wykonywania:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
Użyłem prostego wiązania do TextBlock, aby zobaczyć wynik, a polecenie jest powiązane z przyciskiem. To działa dobrze. Czego nie dostaję, to użycie wyrażenia lambda do utworzenia polecenia. TheAction<object>
oczekuje, że parametr nie? dlaczego więc ten kod działa?
Jeśli zmienię powyższy kod na
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
Dostaję te błędy:
* Najlepiej dopasowana metoda przeciążona dla 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' ma kilka niepoprawnych argumentów
Argument 1: nie można przekonwertować z „void” na „System.Action” *
i usunięcie()
po wykonaniu wykonaj ten błąd:
Argument 1: nie można przekonwertować z „grupy metod” na „System.Action”
Ale jeśli zmienię kod w ten sposób:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent = DateTime.Now.ToString();
}
spełnia i działa dobrze. Jeśli zmienię widok, aby użyć CommandParameter, mogę użyć param, aby ustawić treść tekstu za pomocą tej metody, ale jeśli użyję stylu lambda, muszę przekazać parametr do linii, tak jak to jest w param =>this.UpdateTextContentCommand_Execute(param)
.
W moim teście trudno jest kodować wartość CommandParameter, ale przypuszczam, że najprawdopodobniej byłyby to dane powiązane z właściwością ViewModel w rzeczywistym systemie, aby można było przekazać parametr w stylu lambda.
Czy ktoś może wyjaśnić, dlaczego wersja bez parametrów działa w stylu lambda?
Dzięki za poświęcenie czasu na przeczytanie tego.
Wydaje się, że poniższe pytanie miało również kilka pytań na temat lambda, ale nie widzę, że odpowiada na moje pytanie.
Przekazywanie parametru za pomocą RelayCommand zdefiniowanego w ViewModel (z przykładu Josh Smith)