2011-01-10 10 views
2

最近、画面が閉じられた後にコマンドのCanExecute()が呼び出されたので例外が発生しました。ViewModelsとCanExecuteハンドラを廃棄する

これは、メソッドに余分なチェックを追加することで簡単に修正できますが、ビューモデルが適切に処理されていないと、アプリケーションの生涯のパフォーマンスが懸念されます。

私はViewModelにプロパティとしてそれらを格納してコマンドを接続し、次にxamlでそれらにバインドします。

誰もが閉じたウィンドウがCanExecute()メソッドを呼び出すのを続ける理由を知っていますか?

+0

http://social.msdn.microsoft.com/Forums/en/wpf/thread/43fc6beb-0733-424a-a915-0e03b4ce2ae0が役に立つ場合があります。 – Gqqnbig

答えて

2

おそらく、あなたのビューモデルでコマンドハンドラまたはプロパティが変更されたハンドラがまだ生きています。したがって、ビューモデルはまだ存在し、したがってcanexecuteはまだ実行されています。 CommandManager.RequerySuggestedを購読して、コマンドを更新したとします。このイベントは、ビューモデルが作成されるウィンドウだけでなく、すべての更新で呼び出されます。

ビューモデルのIsClosed状態をfalseに設定するためにClosed(ウィンドウ)またはUnloaded(usercontrol)イベントをサブスクライブしてから、コマンドを削除するか無効にしますRelayCommandでこの機能を実装します)。

2

これが起こっている理由は、CommandManagerがハンドラがガベージコレクションされるまで、CanExecuteの起動を停止する必要がないということです。

私は同じ問題を抱えていましたが、ウィンドウのDataContextをウィンドウを閉じる直後にnullに設定して解決しました。コマンドがViewModelにバインドされていると仮定すると、正常に動作します(DataContextを削除するとcanExecuteイベントハンドラの登録が解除されます)。