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; }
}
  1. Hat dieses Leck der schwache Verweis bis zur RelayCommand's client, erfordern, dass der Benutzer des RelayCommand verstehen, die Umsetzung der CanExecuteChanged und halten ein Leben auf sich selbst verweisen?
  2. 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 der CanExecuteChanged 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

Schreibe einen Kommentar