web-dev-qa-db-ja.com

CanExecuteChangedとCommandManager.RequerySuggestedの実際のタスクは何ですか?

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

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

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

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

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

上記のコードは、 ここRelayCommandクラスからのものです。

36
  1. CanExecuteChangedは、そのButtonにバインドされているコマンドソース(MenuItemICommandなど)に、CanExecuteによって返される値がかわった。コマンドソースは、通常、それに応じてステータスを更新する必要があるため、これを気にします(たとえば、CanExecute()Buttonを返す場合、falseはそれ自体を無効にします)。
  2. _CommandManager.RequerySuggested_イベントは、コマンドの実行能力に影響を与える何かが変更されたとCommandManagerが判断したときに発生します。これは、たとえば、焦点の変更である可能性があります。このイベントは頻繁に発生することが判明しました。

したがって、本質的に、このコードのビットは、コマンドマネージャーがコマンドの実行能力が変更されたと考えるときはいつでも、実際には変更されていなくても、コマンドがCanExecuteChangedを発生させるようにします。

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

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

47
Kent Boogaart
  • RoutedCommandsは、CanExecuteが変更されたかどうかを自動的に通知できます。WPFシステムが認識していないICommandをここに実装しているため、CommandManagerのRequerySuggestedイベント。
  • 現在、このイベントは、フォーカスが変更されたり、コントロールが編集されたりしたときに、WPFシステムによって頻繁に呼び出されます。したがって、CanExecuteChangedが発生します。ボタンがこのイベントをリッスンしているときに、CanExecuteが再度呼び出され、最新のステータスがわかります。

これが 記事 興味深いかもしれません。

5
anivas