RelayCommandで使えそうなアレを作ってみた

あすかです。

冬に出す同人本、180ページまで進みました。
技術本の他にも漫画(18禁)を一緒に出す予定もあって、いろいろ忙しいけど頑張ってます。
とりあえず、本の中から使えそうな部分をちょいちょいしてきます。

まずは冒頭のオブジェクト指向の話!・・・はいきなりだとちょっと重いので、
RelayCommandでなんか作ってみた話をします。

RelayCommandのCanExecute、使ったほうがいいとはわかってるけど設定するのがめんどくて結局使ってないんですよね。
なので、モデルのイベントをCanExecuteChangedに繋げる処理を抽象化するメソッド書いてみました。


まず、前提としてこういうRelayCommandがあるとします。

そして今回作ったコードがこちら。

これをどうやって使うかといいますと、ビューモデルでコマンドを作る時、

こうやって使います。
GetCommandWithCanExecuteメソッドの第1引数にはモデルのboolプロパティをラムダ式で、第2引数にはこのコマンドをExecuteするときの実行内容を記述します。
たったのこれだけで、モデル側がHasInitializedプロパティの値を変えただけで、CanExecuteChangedイベントが呼び出されるようになります。
ビューモデル内でPropertyChangedイベントをCanExecuteに繋げる処理を書く必要がなくなって楽です。

ただ、実際はCanExecuteに渡したいのはプロパティではなくメソッドだっていう場面があると思います。
また、PropertyChangedではなく他のイベントにもつなげたいという場面も出てきます。
そういう時は、結果的にはGetCommandWithCanExecuteの引数をもう1つ増やす方向になります。
時間稼ぎをしたいのでその話はまた次回にする方向で。

今回、式木や弱い参照を普通に使ってますが、私が普段使っているコードではなくこの本のために書き下ろしたやつです。もちろん使用実績はありません。安定させるために、これからちょいちょい使わないとですね(´・ω・`)
プロパティ1つにつき1つのデリゲートをPropertyChangedにつなげてるので、たくさんのコマンドからCanExecuteChangedを呼び出す時にパフォーマンス面で不利ですね。ここもなんとかならないのかなぁ‥‥。

本の中で難しいのは多分ここだけです。早くもネタ切れです(´・ω・`)