Josh SmithのMVVMから次のコードを取得しました チュートリアル 。
このコードが実際に何をするのか、誰かが簡単に説明できますか?
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
私は2つのことを理解できません:
CanExecuteChanged
イベントは何をしますか?CommandManager.RequerySuggested
行う?上記のコードは、 ここ のRelayCommand
クラスからのものです。
CanExecuteChanged
は、そのButton
にバインドされているコマンドソース(MenuItem
やICommand
など)に、CanExecute
によって返される値がかわった。コマンドソースは、通常、それに応じてステータスを更新する必要があるため、これを気にします(たとえば、CanExecute()
がButton
を返す場合、false
はそれ自体を無効にします)。CommandManager.RequerySuggested
_イベントは、コマンドの実行能力に影響を与える何かが変更されたとCommandManager
が判断したときに発生します。これは、たとえば、焦点の変更である可能性があります。このイベントは頻繁に発生することが判明しました。したがって、本質的に、このコードのビットは、コマンドマネージャーがコマンドの実行能力が変更されたと考えるときはいつでも、実際には変更されていなくても、コマンドがCanExecuteChanged
を発生させるようにします。
私は実際、_ICommand.CanExecuteChanged
_を実装するこのアプローチが嫌いです-怠惰に感じ、完全に信頼できるわけではありません。コマンドがメソッド(例:RaiseCanExecuteChanged()
)を公開してCanExecuteChanged
を発生させることができる、はるかにきめ細かいアプローチを好みます。その後、ビューモデルから適切なタイミングでこれを呼び出します。 。
たとえば、現在選択されている顧客を削除するコマンドがある場合、選択されている顧客がいる場合にのみtrue
を返すCanExecute()
ハンドラーがあります。したがって、選択した顧客が変わるたびにRaiseCanExecuteChanged
を呼び出します。
RoutedCommands
は、CanExecute
が変更されたかどうかを自動的に通知できます。WPFシステムが認識していないICommand
をここに実装しているため、CommandManagerのRequerySuggested
イベント。CanExecuteChanged
が発生します。ボタンがこのイベントをリッスンしているときに、CanExecute
が再度呼び出され、最新のステータスがわかります。これが 記事 興味深いかもしれません。