2011-01-10 9 views
2

Ich hatte vor kurzem eine Ausnahme, weil der CanExecute() eines Befehls aufgerufen wurde, nachdem der Bildschirm geschlossen wurde.Disposing ViewModels & CanExecute Handler

Es ist leicht zu beheben, indem eine zusätzliche Überprüfung der Methode hinzugefügt, aber jetzt bin ich besorgt über die Lebensdauer Leistung meiner Anwendung, wenn die Viewmodels nicht ordnungsgemäß entsorgt werden.

Ich verbinde Befehle, indem ich sie als Eigenschaft im ViewModel ablege, und binde sie dann in XAML.

Also weiß jemand, warum ein geschlossenes Fenster weiterhin Aufrufe an CanExecute() Methoden machen würde?

+0

http://social.msdn.microsoft.com/Forums/en/wpf/thread/43fc6beb-0733-424a-a915-0e03b4ce2ae0 kann Ihnen nützlich sein. – Gqqnbig

Antwort

2

Wahrscheinlich haben Sie in Ihrem Ansichtsmodell immer noch Befehlshandler oder Eigenschaftenänderungshandler. Daher ist das Ansichtsmodell immer noch vorhanden und daher wird der Canexecute weiterhin ausgeführt. Wahrscheinlich haben Sie den CommandManager.RequerySuggested abonniert, um Ihre Befehle zu aktualisieren. Dieses Ereignis wird bei ALLEN Aktualisierungen aufgerufen, nicht nur in dem Fenster, für das Ihr Ansichtsmodell erstellt wurde.

Sie sollten (oder können) die Ereignisse Geschlossen (Fenster) oder Entladen (Benutzersteuerung) abonnieren, um den IsClosed-Status des Ansichtsmodells auf false zu setzen und dann die Befehle zu entfernen oder sie zu deaktivieren um diese Funktion im RelayCommand zu implementieren).

2

Der Grund, warum dies geschieht, ist, dass CommandManager keine Ahnung hat, dass es aufhören sollte, CanExecute zu feuern, bis der Handler den Müll sammelt.

Ich hatte das gleiche Problem, und ich habe es gelöst, indem Sie DataContext des Fensters zu null direkt nach dem Schließen des Fensters. Es funktioniert einwandfrei unter der Annahme, dass die Befehle an ViewModel gebunden sind (das Entfernen des DataContext hebt die Registrierung der canExecute-Ereignishandler auf).

Verwandte Themen