3

BackgroundWorkerMVVM アプリケーションに応答性の高い UI を実装しようとしているので、UI をブロックしないように、すべてのコマンド ハンドラーを自動的に実行するように選択しました。

しかし同時に、バックグラウンドで実行中にユーザーが同じコマンドを実行できるようにしたくありません。解決策は明らかです:

  1. Executedハンドラーが呼び出されたら、CanExecuteハンドラーを返すfalse
  2. BackgroundWorker非同期を開始する
  3. BackgroundWorker終了したら、CanExecuteハンドラーtrueを再び戻します。

問題は、ステップ1の後とステップ3の後にWPFに通知する必要があり、CanExecute変更が必要であることです。を呼び出すことで実行できることはわかっていますがCommandManager.InvalidateRequerySuggested、これにより、CanExecute他のすべてのコマンドのハンドラーも再クエリされます。たくさんのコマンドを持っているのは良くありません。

特定のコマンド、つまり現在実行中のコマンドの再クエリを要求する方法はありますか?

ティア

4

3 に答える 3

6

これら 2 つのケースでICommand.CanExecuteChangedIsEnabledイベントを発生させるだけでよく、対応するコントロールがその状態を更新する必要があると思います。

于 2010-03-23T11:12:54.497 に答える
1

コマンドのRaiseCanExecuteChanged()を公開するMVVMHelper`DelegatingCommand'を使用します。

したがって、BackgroundWorkerでRunWorkercompletedイベントをサブスクライブし、ログに記録された作業の種類に応じて(おそらく、結果の一部として返すことができます)Command.RaiseCanExecuteChanged()、ViewModelから呼び出すことができます。

于 2011-12-12T13:41:09.730 に答える
1

そうです、CanExecuteChanged イベントを発生させるだけです。でも正直、あなたの実装はわかりませんが、CanExecuteの述語が単純であれば、wpfがリクエリしていることに気づきにくいと思います。パフォーマンスの低下に気付くとは信じられません。パフォーマンスをテストしましたか? ViewModel に 20 個の ICommand があるとします (これはおそらく多すぎます)。ICommand.CanExecute が、バックグラウンドワーカーに基づいて true と false に設定しているブール値フィールドを指している場合、ナノ秒未満で済むはずです。しかし、CanExecute が評価するメソッドを指している場合、それは長くなる可能性がありますが、それでも目立たないのではないかと思います。

しかしねえ、私はあなたの実装を知りません。

于 2010-03-25T04:11:32.090 に答える