Ich lerne derzeit WPF und MVVM, ich denke, ich bekomme das meiste davon und wie es funktioniert, aber ich habe etwas über die Verwendung der RelayCommand (oder DelegateCommand), die ich nicht verstehe. Ich denke, es hat damit zu tun, wie die Delegierten arbeiten.Relaycommand und parameterless execute-Methode
Bitte beachten Sie, dass der unten stehende Code zur Zeit nur Testlösungen enthält, also keinen Live-Code. Ich denke darüber auch nach Befehlen, die keinen Parameter wie Schließen benötigen, und um zu verstehen, warum es funktioniert.
Also, wenn ich nehme die RelayCommand dass Josh Smith erstellt (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) Ich kann Setup einen Befehl wie folgt aus:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
mit dieser Methode execute:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
Ich benutzte eine einfache Bindung an ein TextBlock, um das Ergebnis zu sehen, und der Befehl ist an eine Schaltfläche gebunden. Das funktioniert gut. Was ich nicht bekomme, ist die Verwendung des Lambda-Ausdrucks, um den Befehl zu erstellen. Die Action<object>
erwartet einen Parameter nicht wahr? Warum funktioniert dieser Code?
Wenn ich den obigen Code ändern zu
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
ich diese Fehlermeldung erhalten:
* Die beste überladene Methode Spiel für 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' hat einige ungültige Argumente
Argument 1: kann von 'Leere' auf 'System.Action' *
und Entfernen des ()
nicht konvertieren nach gibt Execute diesen Fehler:
Argument 1: kann nicht von 'Methodengruppe' auf 'System.Action'
konvertieren Aber wenn ich den Code wie folgt zu ändern:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent = DateTime.Now.ToString();
}
es erfüllt und läuft gut. Wenn ich die Ansicht ändere, um CommandParameter zu verwenden, kann ich param benutzen, um den Textinhalt mit dieser Methode zu setzen, aber wenn ich den Lambda-Stil verwende, muss ich einen Parameter an die Linie übergeben, so wie dieser param =>this.UpdateTextContentCommand_Execute(param)
.
In meinem Test kodiere ich den CommandParameter-Wert hart, aber ich denke, es wäre höchstwahrscheinlich Daten an eine Eigenschaft des ViewModel in einem realen System gebunden, so dass Sie den Parameter im Lambda-Stil übergeben könnten.
Kann mir jemand erklären, warum die parameterlose Version mit dem Lambda-Style funktioniert?
Danke, dass Sie sich die Zeit genommen haben, dies zu lesen.
Es scheint, dass die Frage unten einige Fragen über das Lambda hatte, aber ich sehe nicht, dass es meine Frage beantwortet.
Passing a parameter using RelayCommand defined in the ViewModel (from Josh Smith example)
+1 für eine detaillierte Frage, die zeigt, dass Sie bereits etwas versucht haben. –
Prost. Ich versuche immer, mich zu bemühen, Fragen zu stellen, da ich Fragen wie diese nützlich finde, wenn ich nach Antworten suche. – Kioshiki