10

次の記事に基づいて、MVVM パターンを使用して WPF アプリケーションを作成しています: WPF Apps With The Model-View-ViewModel Design Pattern

ビューに 2 つのボタンがあり、ボタンの「コマンド」プロパティが (データ バインディングで) RelayCommand クラスの特定のインスタンスにバインドされています (上記の記事の「図 3 The RelayCommand クラス」を参照)。RelayCommand クラスは、指定されたコマンドを実行できるかどうかのチェックをサポートしています。

WPF は、コマンドを実行できないボタンを自動的に無効にします。

私の各コマンド (ViewModel クラス内) はバックグラウンド操作を開始し、バックグラウンド操作が終了するまでコマンドを再度実行することはできません。RelayCommand インスタンスには、バックグラウンド操作がまだ機能しているか、完了しているかに関する情報があります。

私の問題は次のとおりです。いずれかのボタンを押した後、バックグラウンド操作が開始され、コマンドが完了するまでコマンドを実行できないため、ボタンは自動的に無効になります(これは問題ありません)が、操作が完了すると、ボタンは無効になります。コマンドの「実行可能」述語が自動的に再評価されないため、自動的に有効になりません。再評価は、アプリケーションを緩めてフォーカスを取り戻す (ALT + TAB を押す) ことにより、手動でトリガーできます。このトリックを実行すると、ボタンが再び有効になります。

ボタンのコマンドの「実行可能」状態をプログラムで再評価するにはどうすればよいですか?

4

1 に答える 1

20

CommandManager で InvalidateRequerySuggested を呼び出して、CanExecute を再クエリする必要があることを通知できます。

CommandManager.InvalidateRequerySuggested();

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

これは、特定の ICommand 実装が ICommand.CanExecuteChanged パターンを適切に実装しているかどうかに依存するため、YMMV.

アップデート

たとえば、独自の基本実装 ICommand: DelegateCommand を持つ Prism を使用します。Prism の DelegateCommand で RaiseCanExecuteChanged() を呼び出すとうまくいくことがわかりました。

更新 2

また、UI スレッドで InvalidateRequerySuggested() を呼び出していることを確認してください。必要に応じて Dispatcher を使用して電話をかけます。

于 2010-06-06T15:59:36.720 に答える