Life is Really Short, Have Your Life!!

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

WPFのデータバインディングの基礎を学ぶ

現在弊社内で動いている販売管理システムは、使い慣れたWindowsフォームで作りました。最たる理由はドットインパクトプリンタに印字命令を出せることで、ブラウザではその機能がないので、ネイティブなライブラリということで.NETを採用した、という感じ。

で、Windowsフォームでアプリを作ったのですが、もうメンテしかされないテクノロジーと心中するのは微妙。モダンな開発環境でWPFを勉強して、Windowsアプリを作りたいと思っています。

で、Windowsフォーム時代で、最もやらかしたと後悔してるのがビューとプロパティのバインドです。DataGridViewの数量・単価のセルが変更されると、その当該画面の合計テキストボックスの値が再計算する必要があります。

ViewModelを知らなかった2年ぐらい前の僕は、

  • DataGridViewの数量と単価のセルにイベントハンドラを作る。
  • ハンドラ内でバインドしてるDataTableを回して集計
  • 集計結果をそのDataGridViewがAddされたPanelのTextBoxへ渡す

・・・っていう実にかっこわるい設計で組んでしまいました。DataGridView側からパネルの再計算コマンドを呼んで、それを各パネルが"実装"して該当のTextBoxへ値を渡すという。形を変えたコピペが生み出されてしまい、実に良くない。

そーゆー悲劇を生みたくないので、MVVM的な考え方でいけば

  • セルのchangeイベントでViewModelのPropetyChangedイベント発行
  • バインドされたプロパティをListenしているViewの値も自動的に変更。

データを変更するだけでUIの値が自動的に変動する。これよ。

この流れを学べば、子画面起動→親画面へ値を渡すということもバインドするだけになるはずで、バインドする所さえ設計できていれば(Frameworkを活用する等して)Viewのコードはかなりスッキリする。またViewModelのプロパティだけ参照すればいいので、表とグラフを同時に出すなんてこともできるようになる。

というわけで、WPFのデータバインディングを勉強しましょう、と。

WPFのデータバインディングの基本

データとUIをどうやってバインドするかは、こうやってやるそうだ。

http://image.itmedia.co.jp/ait/articles/1010/08/ap-introwpf_05_02.gif

  • バインドしたいプロパティをUIは指定する
  • データソースはDataContextを通す

これがお作法だと。単純なバインドだったらこれで十分だね。

ただ、バインドできるUIのプロパティ(ターゲット・プロパティ)は依存関係プロパティでなければならないという制約がある。「ほかの要素の値に依存してプロパティの値を決定する」要素があるので、普通のプロパティと違うぞという位置づけになっている。例えばWindowでフォントを決めたらそのWindow内のラベルでもそのフォントが使われる、的な。

ま、実際問題はModelのプロパティをバインドするから、それでいいんじゃないかな。Viewのスタイルにバインドさせる為にこんなことやらんからね。

さて、今日はここまで。