2

RelayCommand の標準的な Josh Smith 実装を使用して、WPF/MVVM アプリケーションに ICommands を実装しています。参照: MVVM デザイン パターンを使用した WPF アプリ

私の CanExecute メソッドのいくつかは、実行に時間がかかります。個々に、それらは悪くありません (それぞれ数分の 1 秒)。しかし、UI にバインドするコマンドが多いほど、アプリケーションの応答が遅くなることに気付きました (10 秒を超える遅延 - うんざり)。

RelayCommand CanExecuteChanged が CommandManager.RequerySuggested イベントにフックされており、ViewModel テンプレートが IDataErrorInfo 検証の一部として CommandManager.InvalidateRequerySuggested() を呼び出しているためだと思います。

私の ViewModels は IDisposable を実装しているので、OnDispose メソッドを利用して RelayCommands をクリーンアップしようとしましたが、VM が破棄された後も ICommand.CanExecute メソッドが呼び出され続けます。

これにより、何か (CommandManager?、View?) が RelayCommand への参照を保持していると結論付けました。

RelayCommands を解放および破棄して、目的の有効期間が切れた後に再クエリされないようにするための適切なパターンを持っている人はいますか?

CanExecute をいつ呼び出す必要があるかを管理するより良い方法はありますか?

4

1 に答える 1

0

MVVM Light の RelayCommand 実装を取り出してCommandManager.RequerySuggested使用できます。注: これには、CanExecute を更新したいときはいつでも明示的に呼び出す必要があります。RaiseCanExecuteChanged()

于 2011-10-06T14:06:21.167 に答える