1.MVVM
MVVMインフラストラクチャーとは
•MVC(Model View Controller モデル・ビュー・コントローラ)は、ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンです。
システムは、多くのプログラムの集まりです。このプログラムには、機能の似たものもいっぱいあります。似た機能を大きく分けると下記の3となります。
①画面 ビュー(View)
②画面の処理の部分 コントローラー、ビューモデル(制御、Controller、ViewModel)
③データを扱う部分 モデル(Model)
これをMVCモデルいいます。
•この考え方は1979年頃に考案され、その後、発展をして来ました。
また、このMVCの派生パターンであるMVVMモデルは2005年にマイクロソフト社が発表したユーザーインターフェースサブシステムである WPF(Windows Presentation Foundation)やSilverlightの世界で生まれた考え方です。
現在はAndroidやウェブブラウザ上でのJavaScriptの世界でもMVVMの利用は広がっています。
•これらは、ビューとそれ以外を別々の人で開発するのに適しています。よく耳にしますWebデザイナーとは、正にこのビューを開発する人のことを言います。美術的な能力の高い人が手掛けています。
•WPFでMVCを実装するには、MVVMインフラストラクチャ(Livet、MVVM Light Toolkit、Prism等)を導入するのが一般的です。
MVVMパターンでは、ViewとViewModeはデータ・バインドという手法で対話をします。このことにより、ViewとViewModelは分担開発が可能です。Viewに表示する情報はプロパティとしてViewModelで公開します。
•また、MVVMを積極的に利用する動機としてメモリ・リーク対策も考えられます。
リッチクライアントでのWPFでは、その構造上どうしてもメモリ・リークのリスクが高くなります。
しかし、Messenger+トリガー・アクションなどを使用してViewModelとViewの間の対話方法をデータ・バインディングのみに制限すれば、データ・バインディング機構の中で隠ぺいされた形でWeakEventパターンが適用されメモリ・リークは発生しません。
•同じく、ViewModelとModelの間のメモリ・リーク問題もあります。
Modelのイベントを単純にViewModelが購読しようとした場合、ViewModelが先に消滅しようとした際に
メモリ・リークが発生します。
ウィンドウなどが対応するViewModelをDataContextプロパティとして持つことが多いため、ウィンドウを閉じる処理などに伴って、
この問題に悩まされることがあります。この場合も、ViewModel自身がModelのイベントの購読開始と自身の破棄のタイミングでの購読解除をしっかり管理すればよい話ですが、やはり非常に面倒なコーディングを強いられます。
しかしMVVMインフラストラクチャ(例えばLivetなど)では、こういった場合の対策として、イベント代替の手段がしっかりと用意されています。
(以上、Livet開発者の尾上雅則氏(おのうえ まさのり)の解説を参考にさせて頂きました。)
Livetの使用
•以上のように、WPFのシステムを開発するには、MVVMインフラストラクチャの使用がベストであり、その中でもベストであるLivetをシステムの基本構成サンプルでは使用します。
Livetのダウンロードとインストール方法はサイドメニューで紹介しています。インストールは「超簡単」です。
RaisePropertyChangedとViewModelCommand
•画面のプロパティ値が変更されたことをViewModelに通知するためには、WPFでは、NotifyPropertyChangedやOnPropertyChangedを使用
しますが、
Livetでは、RaisePropertyChangedを使用します。
又、コマンドの実装では、WPFでは、ICommand、DelegateCommand、RelayCommandといったものを使用しますが、Livetでは、ViewModelCommandを使用します。
MVVMを使わずにWPFを勉強しだした人が困惑するのは、このプロパティ値の変更の対処法やコマンドの実装方法です。Livetを使用しますと、RaisePropertyChangedやViewModelCommandの使い方は非常に簡単です。