Ist Josh Smiths Implementierung des RelayCommand fehlerhaft?
Betrachten der Referenz Josh Smith' Artikel WPF-Anwendungen Mit Dem Model-View-ViewModel Design Patterninsbesondere die Beispiel-Implementierung einer RelayCommand
(Abbildung 3). (Keine Notwendigkeit, Sie zu Lesen, durch die ganzen Artikel für diese Frage.)
Im Allgemeinen, ich denke, die Umsetzung ist hervorragend, aber ich habe eine Frage über die delegation von CanExecuteChanged
Abonnements für die CommandManager
's RequerySuggested
Veranstaltung. Die Dokumentation für RequerySuggested
Staaten:
Seit diesem Ereignis ist statisch, es wird
nur halt an der hf als schwach
Referenz. Objekte, die zu hören für
diese Veranstaltung soll weiterhin ein starker
Verweis auf Ihre event-handler
vermeiden, es wird Müll gesammelt. Diese
kann erreicht werden durch eine
privaten Bereich und die Zuordnung der
handler als Wert vor oder nach
Befestigung an dieses Ereignis.
Doch die Beispiel-Implementierung von RelayCommand
nicht halten Sie solche an den registrierten handler:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- Hat dieses Leck der schwache Verweis bis zur
RelayCommand
's client, erfordern, dass der Benutzer desRelayCommand
verstehen, die Umsetzung derCanExecuteChanged
und halten ein Leben auf sich selbst verweisen? -
Wenn dem so ist, macht es Sinn, zum Beispiel, ändern Sie die Implementierung der
RelayCommand
etwas wie den folgenden zur Begrenzung der potenziellen vorzeitigen GC derCanExecuteChanged
Abonnenten://This event never actually fires. It's purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; this.canExecChangedRef += value; } remove { this.canExecChangedRef -= value; CommandManager.RequerySuggested -= value; } }
InformationsquelleAutor der Frage Greg D | 2010-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auch ich glaube, dass diese Implementierung ist fehlerhaftweil es definitiv verliert den schwachen Verweis auf die Ereignisprozedur. Dies ist etwas, was eigentlich sehr schlecht ist.
Ich bin mit dem MVVM Light toolkit und die
RelayCommand
darin umgesetzt und implementiert ist es nur wie in dem Artikel.Der folgende code wird nie aufrufen
OnCanExecuteEditChanged
:Jedoch, wenn ich eine änderung wie diese, wird es funktionieren:
Der einzige Unterschied? Nur wie in der Dokumentation von
CommandManager.RequerySuggested
ich bin das speichern der event-handler in einem Feld.InformationsquelleAutor der Antwort Daniel Hilgarth
Habe ich die Antwort gefunden, in Josh ' s Kommentar auf seine "Verständnis Weitergeleitet Befehle" Artikel:
Das argument scheint zu sein, dass
CanExecuteChanged
implementors müssen nur halt schwach auf der registrierten Handler, da WPFVisuals
sind zu dumm, um zu trennen Sie sich. Dies wird am einfachsten realisiert durch das delegieren an denCommandManager
wer tut dies bereits. Vermutlich aus dem gleichen Grund.InformationsquelleAutor der Antwort David Schmitt
Gut, nach Reflektor implementiert die gleiche Art und Weise, in der
RoutedCommand
Klasse, also ich denke, es muss OK sein... es sei denn, jemand im WPF-team einen Fehler gemacht 😉InformationsquelleAutor der Antwort Thomas Levesque
Ich glaube, es ist fehlerhaft.
Durch Umleitung der Ereignisse auf der BefehlsManager, bekommen Sie das folgende Verhalten
Jedoch, was passiert, wenn Sie wünschen, informieren Sie alle Steuerelemente an einem einzigen Befehl zu re-evaluieren, die CanExecute-status? In seiner Umsetzung, Sie gehen müssen, um den BefehlsManager, Bedeutung
Jeden einzelnen Befehl verbindlich, Ihre Anwendung wird neu bewertet
Umfasst alle diejenigen, die don ' T Angelegenheit zu einem Hügel von Bohnen, diejenigen, bei denen die Bewertung der CanExecute-Nebenwirkungen (wie z.B. Datenbank-Zugriff oder lang laufende Aufgaben), diejenigen, die darauf warten, abgeholt zu werden... es ist wie mit einem Vorschlaghammer auf Laufwerk a friggen Nagel.
Sie haben, um ernsthaft über die Auswirkungen dieses Vorgangs.
InformationsquelleAutor der Antwort Will
Ich möglicherweise fehlt den Punkt hier aber nicht die folgenden bilden den starken Bezug zu den event-handler in den contructor?
InformationsquelleAutor der Antwort Lazarus