WindowsのGUIをWPFで開発する際の王道について再入門しつつ書き記す(適宜修正。自分のための備忘録)。ここでは、画面コンポーネントとは「MVVMパターンに則り構築されたコンポーネント」と定義する。
残件 ~自分の理解を見直す~
- ModelからViewに向かって更新がかかるケースで適宜
アーキテクチャ
MVVMパターン
概念レベルのMVVM
マイクロソフトが示す絵は、MVVMの登場者間の関係、すなわち構造面のアーキテクチャを次のようにポンチ絵で示している。
画面コンポーネントのためのアーキテクチャ
構造面のアーキテクチャ
コンセプトをプログラミングに活かすため、自分なりに構造面のアーキテクチャを少し具体化したものは次の通り。
振る舞い面のアーキテクチャ
登場者間の役割分担を示すため、振る舞い面のアーキテクチャをシーケンス図にしてみた。
言葉で補完してみる
検算として、画面コンポーネントにかかわる最も重要な責務分担ポイントは次の通り。
- View
- GUI(人とシステムのインタフェース、バウンダリ)
- 画面デザイン(入力方法、表示方法)
- Model
- システムの根幹又は根幹に対するプロキシの役目
- 画面一つ程度で済むような小さいプログラムの場合は、Model=システムの根幹
- 複数計算機からなるような大きいシステムの場合は、Model=システムの根幹に対するプロキシ
- システムの根幹又は根幹に対するプロキシの役目
- Command
- システムの中で処理又は処理の入り口の役目
- WPF固有の都合により登場
- WPFはViewとViewModelとの関係においてデータバインドとコマンドバインド(造語)があり、コマンドバインドのために登場
- ViewModel
- Viewと、Model又はCommandとの橋渡し役
- 画面内の閉じる情報を保持(≒プロパティ)
自分なりの精査
自分なりの理解が正しいか、具体的なプログラム、システムを設計してみることで精査する(見直す)。
BMI計算機
要求仕様
次のような画面プログラムを設計してみる。
構造面の設計
振る舞い面の設計
参考
その他覚書
- Modelは必ずしも必要というわけではない。小さいModelや肥大化しないModelの場合は、ViewModel内にModelを内包する方が簡素で見やすいコードになることもある。
- ViewModelでバインドされているプロパティの変更通知は大きく3通りの書き方がある。
- プロパティ名を指定する方法
// プロパティ名を指定する方法
RaisePropertyChanged(nameof(プロパティ名));
protected void RaisePropertyChanged(string propertyName)
{
var h = PropertyChanged;
if (h != null)
{
h(this, new PropertyChangedEventArgs(propertyName));
}
}
- CallerMemberName属性を使ってプロパティ名を省略する方法
RaisePropertyChanged();
protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
- プロパティ名を文字列で指定する方法
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("プロパティ名"));
}
- ICommandの解説
- CanExcecuteChanged
コマンドが実行可能かどうか示す状態に変化があったことを通知するイベント - CanExecute
コマンドが実行可能かどうか返すメソッド - Execute
コマンドの処理を実行するメソッド
- CanExcecuteChanged