WPFを使う-ViewModelとModel(2)

Modelで発生した変更通知をViweModel側でどのように利用するのか。ちょっと書いてみる。

想定する利用ケース

ViewModel側からModelへのアクション、もしくはModel側での何らかのアクションで、ViewModel側に通知をしなければいけないケース。

PlantUML Syntax:</p>
<p>ViewModel -> Model :Data set</p>
<p>Model -> Model :RaisePropertyChanged</p>
<p>activate Model</p>
<p>Model -> ViewModel :changedProperty</p>
<p>activate ViewModel</p>
<p>ViewModel -> ViewModel :RaisePropertyChanged</p>
<p>ViewModel -> View :changedProperty</p>
<p>deactivate ViewModel</p>
<p>deactivate Model</p>
<p>

大体の流れは上記のようになると思う。ここで注目するのは、ViewModelのchangedPropertyの処理。

Modelから上がってきた変更通知情報をもとに、自分自身(ViewModel)の何が更新され、View側に通知する必要があるのか。これをまとめて記述する。

ViewModeの記述


public string data1 {get;set;}
public string data2 {get;set;}
public string data3 {get;set;}
private void changedProperty(object sender, PropertyChangedEventArgs eventArgs) {
	switch (eventArgs.PropertyName) {
	case Property.status:
		RaisePropertyChanged(nameof(data1));
		RaisePropertyChanged(nameof(data2));
		RaisePropertyChanged(nameof(data3));
		break;
	case Property.connect:
		RaisePropertyChanged(nameof(data3));
		break;
	}
}

Model側の記述

通知の呼び出し自体は、RaisePropertyChanged(名称)となるのだが、この名称に関しては、static constで定義しておいた方が良いと思われる。

/// <summary>
/// プロパティ名
/// </summary>
public static class Property {
	/// <summary>持っているステータスが更新された</summary>
	public const string status = "Status";
	/// <summary>接続状態に変更があった</summary>
	public const string connect = "Connect";
}

Model側は、ViewModel側の様にバインドされるわけではないので、個別に名称を決めておく。また、この名称の通知が来た場合の通知内容を記載する。

通知用のインターフェース定義のようなもの。

この定義をもとに、ViewModel側で、どのような対応を行うかを決定する。種となるのは、View側へのさらなる通知になるとは思う。

最後に

今は、一人でプログラムを作っているので、インターフェース定義はあまり重要視していないが、これが複数人数のチームの場合は、View – ViewModel – Model間の各々のインターフェース定義と、それぞれ単体でテストできる環境をまず構築しておかないと、最後の結合時に泣きを見るんだろうな。

後仕様変更時の影響範囲の見積もりとか。

コメント

タイトルとURLをコピーしました