VB のたまご

作成日: 2017/03/19, 更新日: 2017/03/19



MVVM とは

  •  ここでも MVVM とは何かを説明しますが、前回のリンク集も一度目を通しておくことをお勧めします。

  • スポンサーリンク



きっかけ(画面クラスの構造)

  •  例えば足し算アプリを作ることになったとします。画面に TextBox を2つ、Button を1つ配置して、 Button を Click したら、2つの TextBox に入力された数値を足して、結果をメッセージボックスに表示するとします。 この程度なら「Form1」とか「WPFApplication1」で1画面あれば事足りますね。

  •  画面とコードビハインドは2つで1つです。ビルドしたら1つのクラスになります(本来の姿に戻ります?)からね。当たり前ですね。 だから、コード内から画面に配置したコントロールにアクセスすることは至極当然の事です。 なぜなら、画面もコードビハインドも「自分自身なのだから(1つのクラス)」です。

  •  この「当たり前」に対して、実際にアプリケーションを運用していく中で、あれ、なんかおかしくない?この仕組みやりづらくない? と気づいたことがきっかけとなります。

  • イメージ
  •  つまりここでは、「画面」と「コードビハインド」の仲良すぎ(悪く言うと癒着しすぎ)を問題として着目しています。 いや、そもそも「どっちも自分自身なんだけど」というのはその通りなのですが、MVVM では「あなたの分裂能力で困っているので、この能力を封印して、完全にあなたを2つに分割します」となったんですね。 すなわち、「画面」と「それ以外(処理とデータ)」の分離です。

  • Button.Click
    TextBox.Text
    
    「Button, TextBox」・・・コントロール(画面)
    「Click」・・・処理
    「Text」・・・表示データ
    
    「コントロール」が、「処理」と「表示データ」を管理している。
    (「コントロール」と「処理」と「表示データ」がひとまとまりになっている。)
    
    例えばイベント処理。
    あれこれした後、画面に表示されたデータを更新するためには、まずコントロールにアクセスして、
    コントロールのメンバーとなる「Text」プロパティに更新後のデータをセットしなければならない。
    
    「コントロール」を知っていないと何もできない、「コントロール」に依存している。
    

  •  「何に困っているの?」というと、「コントロールを知っていないと(ソース上でコントロールにアクセスできないと)、何もできない」という縛りの仕組みについてです。 「画面は画面のことだけ考えたい」、「足し算処理は足し算処理として、別個で考えたい」。 もしこれができれば、実装が楽になるはずです。

  • スポンサーリンク



MVVM

  •  それを踏まえて分けた結果が以下の図です。

  • イメージ
  •  「画面」と「それ以外」に分けました。 ところで、「分ける」のは良いけど、どうやって組み立てていくのでしょうか?バラバラにして終わりだとプログラムになりません。 最終的には「結合」して、1つのプログラムとして動作しないといけません。 これを解決するのが「データバインド」という仕組みです。WPF では、結合は結合でも「疎結合」という、できるだけ依存しないような結合をすることができます。 後で出てきます。

  •  ところでここまでだと「画面(View)」と「それ以外(Model)」だけで「ViewModel」が出てきていません。 要らないの?というと要ります。

  •  「画面」を考えるとき、「処理」と「表示データ」はどうしても必要です。 ここでは「表示データ」について考えてみましょう。 データを扱う際、(画面用の)表示用データとして考えるよりも、DB 側に位置するデータとして考えることが多いと思います。 例えばこんなの。

  • Public Class Person
    
        Public Property Id As Integer
        Public Property Name As String
        Public Property Age As Integer
    
    End Class
    

  •  画面Aがありこの画面に表示するのは名前だけで、さらに名前の最後に「様」を付けたいとします。 上記のデータ構造は DB 寄りですが、画面Aからすると、画面表示用データ的には Name プロパティの情報だけがほしいですし、文字列追加もしたいです。 Id プロパティと Age プロパティは不要な情報です。

  •  みたいな感じで、「画面」と「それ以外」を直接データバインドできればいいのですが、できない場合もあります。 間に入って、かみ合わない部分を吸収してくれる存在が必要です。 これが「ViewModel」の役目です。

  •  この3つに分割した責務に対して、やり取り(会話、対話とも言う)を追加したのが以下の図です。

  • イメージ

  •  「データバインド」、「変更通知(値が変更されたら自己申告する)機能を持ったプロパティデータ」、「コマンド」、「メッセンジャー」、「ビヘイビア」、「トリガー」、「アクション」 これらが MVVM でのキーワードです。

  •  MVVM がよく分からない場合は、なんとなくこういうことかなって思えるまで、何回でも読み直してください。いろいろなサイトを見るでも良いと思います。 それは、この後でも良いですし、一通り実装を学習した後からでも構いません。やはり、本質は「考え方」からだと思います。