WPF で MVVM
Livet などの MVVM ライブラリを真面目に使いたいので、まずは WPF での MVVM について勉強しました。
メインはここの内容を参考にしました。
WPF/MVVM Quick Start Tutorial - CodeProject
関連してその他いろいろ参考にしました。
連載 WPF/Silverlight UIフレームワーク入門:第2回 データの表示と入力に必要な知識 (1/5) - @IT
CommandManager クラス (System.Windows.Input)
連載:WPF入門:第6回 「コマンド」と「MVVMパターン」を理解する (1/3) - @IT
CommandManager.RequerySuggested を使う意味がよくわからずに困りました。
RoutedCommand.CanExecuteChanged イベント (System.Windows.Input)
RoutedCommand は、CommandManager が発生させる RequerySuggested イベントを待機します。 RequerySuggested イベントは、キーボード フォーカスの変更など、コマンドを実行するかどうかを変更する可能性のある条件が満たされたときに発生します。 コマンドが RequerySuggested イベントを受け取ると、CanExecuteChanged イベントを発生させます。 通常、コマンド ソースはこのイベントを待機し、CanExecute メソッドを使用して RoutedCommand に照会します。 コマンドを実行できない場合、多くのコマンド ソースでは、コマンド バインディングの一部として、自動的に自身を無効にします。 コマンドを実行できない場合に淡色表示になる MenuItem は、その一例です。
CommandManager.InvalidateRequerySuggested メソッド (System.Windows.Input)
CommandManager は、キーボード フォーカスの変更など、一定の条件だけを基に、コマンド ターゲットが変更されたものと判断します。 コマンドを実行不可能にする条件が変更されたことを CommandManager が適切に判断しない場合は、InvalidateRequerySuggested を呼び出すことによって、CommandManager に RequerySuggested イベントを強制的に発生させることができます。
キーボードから入力があったとか、マウスがクリックされたとか、ウィンドウにフォーカスが移ったとか、そのたぐいの動きがあったら RequerySuggested に登録されたイベントハンドラをコールしてくれるのでしょう。
今回の CanExecute の実装は、これにおんぶに抱っこでお世話になることで、いろいろ楽をしているようです。
RequerySuggested が呼び出される正確な条件ってどこかにまとめられてないでしょうか。このへんの挙動を理解した上でないと使いにくいと思います。