2011年05月16日

MVVM:Messenger + Behaviorを理解するために自作してみた(1)

   このエントリーをはてなブックマークに追加 Clip to Evernote
■はじめに

これまで、3回に亘って、Messengerクラスを自作することで、MVVMにおける
Messengerについて理解を深めようとしてきたわけですが、今回は、
「Messenger + Behavior」を使い、ViewModelからViewを操作する方法について考
えてみます。

XAMLにビヘイビアを記述することで、Viewのコードビハインドに、何も記述せずに、
ViewModelからViewを操作できるようになるらしいので、オレオレBehavior を実装して、
これを確かめてみようと思います。

この記事の趣旨は、 MVVMフレームワークがどうやって、Messenger + Behavior を
実現しているかを、理解することなので、当然、Expression Blendに付属している
System.Windows.Interactivity も利用しません。
最低限のものを自作してみます。後処理などは実装していないし、まあ、かなりの手抜きですが...

「Messenger + Behavior」でビヘイビアを利用する目的は、コードビハインドに何も記述することなく、
Viewの動作をXAMLで指定できるようにすることです。
これまでは、Messageを受け取ったViewのコードビハインドで、メッセージに対応するコードを
記述していましたが、これをXAMLで記述できるようにするわけです。
なお、ViewModel側は、前回示したものと変更はありません。Messengerを使って、
メッセージをSendします。

■Actionの実装

まずは、前回までコードビハインドで記述していたMessageBoxの表示をクラスとし
て独立させます。基本的に、このクラスは汎用性のあるものにします。
ここでは、面倒なので、前回までのロジックをそのまま流用します。


IViewAction というインターフェースを定義し、具象クラスの DialogBoxAction
で実装します。
Registerメソッドが呼ばれると、Messageとデリゲートの対応付けを行います。
recipienttとは受取人といった意味があり、Messageを受け取るオブジェクトが渡ります。
通常、WPFの場合は、Windowオブジェクトになります。

この例では、Registerメソッドは、
「recipientがDialogBoxMessageを受け取ったら、ShowMessageメソッドを呼び出す」
ようにお願いているわけです。

このIViewActionの具象クラスには、OpenFileDialogを表示するActionとか、
画面を遷移するActionとかいろんなものが考えられます。

今回は、メッセージとActionを1対1に対応させたため、新たなActionを定義する際は、
それに対応したMessageクラスも定義する必要があります。

Blendに付属しているSystem.Windows.Interactivityでは、この2つも分離し、XAMLで指定できるように
しているようですが、今回は、そこまではやりません。

このIViewActionインターフェースを実装したクラスは、アプリケーションを開発するたびに
定義していたのでは開発効率が悪いですから、あらかじめ汎用的なものを作成しておくのが大前提です。
通常は、フレームワークが用意しておくべきものですね。
足りないものだけを、アプリケーションプログラマーが用意することになるのだと思います。

■ActionCollectionの実装

では、次に、ActionCollectionの定義です。このクラスは、複数の IViewActionを保持で
きるようにするためのものです。


Collection ジェネリッククラスを継承して、独自のコレクションを定義しています。
追加するメソッドは、RegisterAllメソッドです。
このメソッドは、コレクションに格納されている IViewActionオブジェクトのRegisterメソッド(前述したメソッド)を
呼び出します。

このクラスは、XAMLを記述する際に使われます。以下のような記述をします。



■ MessengerBehavior の実装

最後に、上記XAMLにある MessengerBehaviorクラスを実装します。
このクラスは、添付ビヘイビアとして定義します。これは、先ほど定義した
ActionCollentionを保持する添付プロパティ Actions を持っています。


このクラスをビヘイビアと言ってよいのか迷うところです。
このクラスの中では、どこにも、イベントをフックしている箇所はありませんし、
単なる添付プロパティといったほうが良いのかもしれません。

まあ、仕組みを理解することが目的なので、このあたりは深く考えないことにします。

OnActionsPropertyChangedメソッドが呼ばれた時には、IViewActionの具象クラスは、
インスタンス化済みで、そのコレクションが、e.NewValueで参照できます。
このコレクション(ActionCollection) の RegisterAllメソッドを呼び出して、メッセージとActionを
対応付けています。

これで、準備は完了です。

長くなったので、続きはまた今度。

※ここで示したコードは、理解を助けるためのものなので、実際に利用することはお薦めしません。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52146964
この記事へのトラックバック
「C#プログラミング入門」を読ませていただきました。
「C#プログラミング入門」を読ませていただきました。【もり ひろゆきの日々是勉強】at 2011年05月17日 05:55