5 分間で MVVM を概観する

Data-Driven Services with Silverlight 2 という本を書いている John Papa 氏のブログ で「5 Minute Overview of MVVM in Silverlight」という役に立つ投稿があったので共有。

イントロダクションで、「多くの記事は MVVM が何か知っていることを前提に書かれているけれど、この投稿は MVVM 自体の簡単な説明です」と書かれている。今まさに注目されている技術というのは、知っている人たちでどんどん議論が進んでいって新参者は追いつくのが大変なので、こういう基本を勉強できるコンテンツはありがたい。

View

View はユーザーインターフェースを表すクラスです。例えば Silverlight では MainPage.xaml や Page.xaml です。View はコントロール、アニメーション、ナビゲーション、テーマ、その他表示用の対話機能を持っています。Silverlight や WPF ではデータバインディングも View に含まれます。バインディングはデータのどのプロパティを使うかだけを指定していて、プロパティがどこからくるのか (つまりどのインスタンスにバインドされるのか) は意識していません。データソースが View の DataContext にセットされた時に、バインディングがアクティブになります。

View に関する別の意見

XAML 内のリソースで ViewModel を作って View にアサインすることがあります。私は View と ViewModel を分離して連携させる方が好きです。でも、リソースとして View の中で ViewModel を作るのはとてもポピュラーなようです。どちらの方法もいいところがあります。View の中で ViewModel を作ってしまうのは Blend を使う場合に簡単で効率がいいでしょう。View と ViewModel が疎結合であれば DI しやすさやテスタビリティを高めます。

Model

特定のエンティティとして表現されるデータを表すクラスです。例えば、CompanyName や CustomerId のようなプロパティを持った Customer クラスです。Customer Model が Order Model の集合をプロパティとして持つといったように、Model はサブ Model を持つこともできます。Model の目的はデータを表現することであり、どこに表示されるか、どうやって表示されるかに関する情報は持ちません。

Model に関する別の意見

Model にどこから来たかについての情報を与えておく場合があります。しかし、私はこのアプローチをとりません。Model はデータの出所に依存しない状態にしておくのが好みです。しかし、Model が自身の出所を知っていれば、読み込みや保存の方法を Model に持たせることができます。もう一度言いますが、私はこうしません。代わりに、他のクラスに Model の読み込みや保存を担当させます。

ViewModel

ViewModel は View と他のものとの間の接着剤です。View の DataContext には ViewModel のインスタンスがセットされることになります。ViewModel は Model や、View から ViewModel のアクションを実行するための Command プロパティ、View にバインドされるその他のプロパティを持ちます。

ViewModel に関する別の意見

私のアーキテクチャでは、ViewModel クラスは Model にデータを設定するために他のクラスを使います。別の方法として、ViewModel 自身がデータを取りに行かせるやり方があります。ただ、私は1つのクラスには1つの責任だけを持たせたいので、普通はこのやり方を採用しません。

 

Model - View - ViewModel の一般的なイメージ

Model - View - ViewModel の一般的なイメージ

Comments

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる