Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

もう僕はWindowsフォームに戻れない

WPF(・∀・)イイネ!!って思う所書きます。

データバインディングすげー楽

WPFをやってみてこりゃいいと思ったのが、データバインディングの柔軟性でした。「ある値が入るとこっちの値が変わる」という依存性のあるデータの表示処理を、コードビハインド無しで出来るのはすごく魅力的。

あくまでもViewはViewModelをレンダリングするだけというのがお作法だと思いますし、逆らう必要もない。

ただ、複数の人が開発するとデータバインドとコードビハインド(イベントハンドラ)の切り分けが曖昧になってよくわからないコードが散在しそうだから、MVVMフレームワークを導入すべきだと思います。でも、サンプルが貧弱なものが多く「おう、プロジェクトの中身見ればわかんだろ」という強気な姿勢が僕を困らせる。。。いきなりフレームワークの弊害ねw プリミティブに実装して勉強していこう。

もちろん、キーダウンで何かを行うならそれは拾う必要があるけれど。Enter押されたら何かをHookしたい場合とかね。

依存関係プロパティ

依存関係プロパティという概念も慣れるとすごい便利。Windowsフォームでは親のPanelのフォントサイズが20でも、TextBoxのフォントサイズは連動しなかった。WPFではCSSのbodyでフォントサイズを規定すればTextBoxにも連動される(変更を検知する仕組みがプロパティにある)ので、少ないコードで色んな事が出来るようになっています。ViewのスタイリングはCSSのように出来るので、大変楽です。スタイル関係のプロパティをちまちまIDEで弄るとかどうなのほんと。

DataTemplate機能

DataTemplateという機能も大変便利で、例えば元となるJSON/XMLデータは一緒でもGridにしたりグラフすることが動的に切り替えられる。差し込むViewを動的に切り替えられるし、例えばWindowsフォーム時代では大変難しかった1行2列のグリッドも作ることが出来ます。これを上手く使えば小画面開発の工数はかなり減ると思います。

Windowsフォーム開発でD&Dで部品貼り付けをする絶対配置レイアウトに慣れてしまうとWPFのレイアウトはめんどくさく感じると思いますが、HTML/CSSのようにレイアウトを組むのと大差ないしクロスブラウザ問題もないから、慣れちゃえば楽。

MVVMがとっつきにくい問題

言いたいことは分かるんだけどコードにするとちょいとややこしい。モダンなコードも多いので。

依存関係プロパティの場合はそのプロパティが変更されると、変更されたことを検知する仕組みがある。でも、ViewModelのようなCLRプロパティ(普通のクラスのプロパティ)には、そんなもんない。よって、Viewにバインドしたプロパティが変更されたことを検知する仕組みを作らないとあかん。これがViewModelとのやりとりを行う根本的な部分。

その仕組みはINotifyPropertyChangedインターフェイスを実装して値の変更時(ViewModelのプロパティのセッターが呼ばれた時)にPropertyChangedイベントを発生させるというもの。そうするとVMで発行されたイベントがViewに通知されるようになる。

Viewの状態変遷を拾うだけこれでいいけど、VMからViewに何かを通知したい場合(エラーメッセージ・画面遷移等)はコマンドをバインドすることになる。通知条件等は全部VMに出す。下記がわかりやすかった。

VMにViewのインスタンスを持つと酷いことになるから、あくまでViewが知ってるだけにしたい。Commandプロパティがない場合でもBehaviourを使うとコマンドを実行できるらしい。それは知らなかった。

WPF気に入ったで

  • ViewはあくまでViewModelをレンダリングする
  • Viewの値の変更はバインディングでViewModelが吸収する
  • 必要な画面上のビジネスロジックのキックはViewModelのコマンド通知(Messenger)で行う
  • DataTemplate,Resource,Style等をうまく使いViewの動的差し込みを念頭に置く

これらに慣れたら、うん、Windowsフォームには戻れないかな〜