【C# GUI】MVVM③ 変更通知機能 part4-9【WPF XAML】

【C# GUI】MVVM③ 変更通知機能 part4-9【WPF XAML】

今回も,前回のMVVMの続きです.

MVVM開発

変更通知機能の追加

ボタンをクリックしたことによって,プロパティの値が変更されたので,

その時に,変更された事を通知する機能を持つクラスを追加します.

クラス名は「ViewModel」とします. このクラスは後に,MainWindowVMクラスに継承して使うので,

アクセス修飾子「public」を付けます.

また,INotifyPropertyChangedインターフェースを実装します.

INotifyPropertyChangedインターフェースはSystem.ComponentModel名前空間に属するので,

usingディレクティブを追加します.

INotifyPropertyChangedインターフェースにマウスカーソルを合わせて, 電球ボタンから「インターフェースを実装します。」をクリックします.

INotifyPropertyChangedインターフェースを実装する時に必要なコードが自動的に生成されます.

PropertyChangedイベントはプロパティの値が変更されたときに発生するイベントです.

次に,新しくメソッドを作成します.

メソッド名は「OnPropertyChanged」とします.

引数は,呼び出された元のプロパティ名を受け取る為に,

CallerMemberName属性を設定します.(プロパティの値ではなく,プロパティ名です.)

CallerMemberName属性はSystem.Runtime.CompilerServices名前空間に属するので,

usingディレクティブを追加します.

属性は,角括弧「[]」で囲んで記述します.

この属性は既定値を設定する必要があるので,オプションをnullに設定します.

このメソッドは,呼び出した時にPropertyChangedイベントを発生させるようにします.

PropertyChangedイベントは,PropertyChangedEventHandler型です.

PropertyChangedEventHandler型は,2つの引数を必要とします.

1つ目の引数は,object型,

2つ目の引数は,PropertyChangedEventArgs型です.

PropertyChangedEventArgsイベントは引数のプロパティの値が変更された時にイベントが発生します.

属性で受け取ったプロパティ名を引数にします.

今作成したViewModelクラスは,OnPropertyChangedメソッドを呼び出す事によって,

プロパティの値が変更された通知をViewに伝える機能を持つクラスです.  

MainWindowVMクラスの変更

MainWindowVMクラスにViewModelクラスの機能を持たせる為に,ViewModelクラスを継承します.

Viewでは,テキストボックスにCreatedNumberプロパティをデータバインディングしているので,

MainWindowVMクラスのCreatedNumberプロパティを次にように変更します.

プロパティの値がsetアクセサーによって設定されたときに,OnPropertyChangedメソッドが呼び出されるので,

Viewに通知されるようになります.

実行して確認してみましょう.

ボタンをクリックすると,数字列が表示される事が確認できます.

最後に,アプリ起動時のテキストボックスから「Hello, World」を消します.

MainWindowVMクラスのコンストラクタ内の CreatedNumber = “Hello, World”; を削除します.

今回作成したプロジェクトは,こちらに置いておきます.  

まとめ

Windowsフォームアプリケーションは,イベントハンドラーに処理を記述するのに対し,

WPFは,データバインディングにより,データの変更に応じた処理を記述します.

前者はイベントドリブンプログラミングイベント駆動型)と言い,

後者はデータドリブンプログラミングデータ駆動型)と言います.

WPFは,プロパティ,デリゲート,イベントを使う事でViewとViewModelで双方向通信ができる.

要するに,ViewModelからViewのUIに対して,制御ができる.

Windowsフォームアプリケーションより扱いは難しいですが,拡張性や柔軟性はWPFの方があります.

また,UI部分をマークアップ言語で記述しているという所もポイントです.

処理部分と分ける事によって,処理部分は別のUIに使い回せたりします.