しらとりのブログ

社会人ひよこプログラマのtil

WPFことはじめ おすすめ学習ルート

お仕事でWPFのフルスクラッチをすることになったので、そのときに勉強したことの覚書きメモです。詳しい実装については先人の素晴らしい記事がたくさんあるのでここでは言及しません。勉強をはじめたときにこんなペーパーがあったら良かったなーってものを残します。

WPFに関する資料は断片的なものが多い印象で、学習の初期段階で"最低限必要な知識"と"分からないときにググれば済む情報"の見極めが難しかったです。個人的におすすめの学習の順番は以下の通りです。
別個の記事もおいおい追加予定。


クラスの分け方

View-ViewModel-Modelは1:1:多。
ただし付け替えとか考慮するのであれば特に決まりはない。

デザイナー/XAML/プロパティ画面

windows Formsに比べでデザイナーが優秀。XAMLもコントロール配置については直感的で扱いやすいものになってます。 とりあえずプロジェクトを作ったらウィンドウにいろんなコントロールを試し置きして遊んでみるのがおすすめ。バインド、リソース、トリガーなどは後回しで良い。

データコンテキスト

ウィンドウやユーザコントロール(View)が持つプロパティ。
このプロパティに対応するViewModelのインスタンスをセットしてView-ViewModelの紐づけをする。
Viewのコードビハインドでthis.DataContext = new ViewModel(); とするだけ。(他にも方法はあります。)
紐づけするとViewからViewModelのプロパティが参照できるようになる。

データバインディング

画面(View)からソース(ViewModel)への値の同期。
コントロールのプロパティをViewModelのプロパティに紐付け(バインド)すること。

INotifyPropertyChangedインターフェース

ソース(ViewModel)から画面(View)への値の同期。
データバインディングだけでは実行中にViewModelのプロパティの値が変更されても画面がそれを感知できない。このインターフェースに定義されるイベントをプロパティのセッターで発生させて画面を更新されたことを通知する。

BindableBase,またはNotifyObjectクラス

INotifyPropertyChangedインターフェースのヘルパークラス。
INotifyPropertyChangedのイベントを毎回実装するのは面倒なので、これを実装したクラスを作っておいてViewModelに継承させる。なんで標準に無いんだ...

コマンドバインディング

ViewのイベントとViewModelにあるメソッドの紐付け。
MVVMではViewはプレゼンテーション担当で、コードビハインドにイベントハンドラを書くことは禁じ手なのでViewModelに処理を持っていくための仕組み。 持っていくというよりはコマンドを公開してそれをViewが利用する形か。

ICommandインターフェース

ViewModelのメソッドをViewにプロパティとして公開するためのインターフェース。
コマンドバインディングの実装に使う。

RelayCommandまたはDelegateCommandクラス

ICommandインターフェースのヘルパークラス。
BindableBaseクラスと同様に毎回実装するのは面倒なのでViewModelのメソッドを委譲してICommandとしてViewに公開する。 イベントハンドラの代わりになるものをViewModelに作ることができる。なんで標準に(

ViewModelの責務

Viewのコントロールをモデル化してプロパティにすること。
Modelのプロパティ変更イベントを受け取ってViewに通知すること。 Viewにコマンドを公開すること。 Modelのメソッドを呼び出す事。

silatori.hatenablog.com

MVVMインフラの学習

上記に書いてきた実装を補助するライブラリを学習する。
Prism、MVVM Light、Livet、Caliburn.Microなど。

慣れている人ならMVVMインフラのチュートリアルをこなすのが一番ですが、C#でとりあえずWPFアプリを作ってみたい方は以上の順番で標準機能に触れてみるのも良いと思います。