Relaiskommando und parameterlose Ausführungsmethode
Ich lerne gerade WPF und MVVM. Ich glaube, ich verstehe das meiste und wie es funktioniert, aber ich bin auf etwas gestoßen, was ich mit dem RelayCommand (oder DelegateCommand) nicht verstehe. Ich denke, das hängt mit der Arbeitsweise der Delegierten zusammen.
Bitte beachten Sie, dass der folgende Code derzeit nur für Testlösungen gilt, also kein Live-Code. Ich überlege dies auch für Befehle, die keinen Parameter wie close erfordern und um zu verstehen, warum es funktioniert.
Also, wenn ich den RelayCommand nehme, den Josh Smith erstellt hat (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) Ich kann einen Befehl wie folgt einrichten:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
mit dieser Methode ausführen:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
Ich habe eine einfache Bindung an einen TextBlock verwendet, um das Ergebnis zu sehen, und der Befehl ist an eine Schaltfläche gebunden. Das funktioniert gut. Was ich nicht verstehe, ist die Verwendung des Lambda-Ausdrucks zum Erstellen des Befehls. DasAction<object>
erwartet einen Parameter, nicht wahr? Warum funktioniert dieser Code?
Wenn ich den obigen Code in ändere
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
Ich erhalte diesen Fehler:
* Die beste überladene Methode für 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' hat einige ungültige Argumente
Argument 1: Konvertierung von 'void' nach 'System.Action' nicht möglich *
und Entfernen der()
after Execute gibt diesen Fehler aus:
Argument 1: Konvertierung von 'Methodengruppe' nach 'System.Action' nicht möglich
Aber wenn ich den Code so ändere:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent = DateTime.Now.ToString();
}
es entspricht und läuft gut. Wenn ich die Ansicht auf CommandParameter ändere, kann ich mit param den Textinhalt mit dieser Methode festlegen. Wenn ich jedoch den Lambda-Stil verwende, muss ich einen Parameter an die Zeile übergeben, damit er diesem Parameter entspricht =>this.UpdateTextContentCommand_Execute(param)
.
In meinem Test habe ich den CommandParameter-Wert hart codiert, aber ich schätze, es handelt sich höchstwahrscheinlich um Daten, die an eine Eigenschaft des ViewModel in einem realen System gebunden sind, sodass Sie den Parameter im Lambda-Stil übergeben können.
Kann mir jemand erklären, warum die parameterlose Version mit dem Lambda-Stil funktioniert?
Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen.
Es scheint, dass die folgende Frage auch einige Fragen zum Lambda hatte, aber ich sehe nicht, dass sie meine Frage beantwortet.
Übergeben eines Parameters mit dem im ViewModel definierten RelayCommand (Beispiel von Josh Smith)