38

Josh Smith の MVVMチュートリアルから次のコードを取得しました。

このコードが実際に何をするかを簡単に説明できる人はいますか?

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }     
}

私は2つのことを理解できません:

  1. イベントは何をしCanExecuteChangedますか?
  2. は何をしCommandManager.RequerySuggestedますか?

上記のコードはRelayCommandClass from hereからのものです。

4

2 に答える 2

50
  1. CanExecuteChangedによって返される値が変更されたことをそれにバインドされているすべてのコマンド ソース ( aButtonや など) に通知します。コマンドソースは、通常、それに応じてステータスを更新する必要があるため、これを気にします (たとえば、が返された場合、 a はそれ自体を無効にします)。MenuItemICommandCanExecuteButtonCanExecute()false
  2. コマンドの実行能力に影響を与える何かが変更されたと が考えるCommandManager.RequerySuggestedたびに、このイベントが発生します。CommandManagerこれは、たとえば、焦点の変更である可能性があります。このイベントは多く発生することがわかりました。

したがって、本質的に、このコードのビットが行うことは、コマンドの実行能力が変更されたとコマンド マネージャーが判断するたびに、CanExecuteChanged実際には変更されていなくてもコマンドが発生することを保証することです。

私は実際、実装に対するこのアプローチが嫌いICommand.CanExecuteChangedです。怠惰に感じ、完全に信頼できるとは言えません。RaiseCanExecuteChanged()私は、コマンドがメソッド (例: raise を呼び出すことができる) を公開CanExecuteChangedし、ビュー モデルから適切なタイミングでこれを呼び出す、はるかにきめ細かいアプローチを好みます。

たとえば、現在選択されている顧客を削除するコマンドがある場合、選択された顧客がある場合にのみCanExecute()返すハンドラーがあります。trueしたがってRaiseCanExecuteChanged、選択した顧客が変わるたびに電話をかけます。

于 2011-07-09T15:42:18.407 に答える
6
  • RoutedCommandsCanExecuteWPF システムが認識していないここで実装しているため、それらが変更された場合に自動的に通知できます。ICommandそれらを CommandManager のRequerySuggestedイベントに接続します。
  • 現在、このイベントは、フォーカスが変更されたとき、コントロールが編集されたときなどに、WPF システムによって頻繁に呼び出されます。したがって、順番CanExecuteChangedに発生します。ボタンはこのイベントをリッスンしてCanExecuteいるため、最新のステータスを知るために再呼び出しされます。

参考になりそうな記事はこちら。

于 2011-07-09T14:21:48.673 に答える