Toolkitを紹介した。今回はソースコードを交えつつ解説したいと思う。今回使用するソースコードは次の場所に公開している。実行後の画面は下図の通りだ。リストがあって、詳細ボタンをクリックすると詳細が表示されるといういたって単純な構成にしてある。プロジェクトの構成は下図の通り。MainView.xamlMainView.xamlにFrameが定義してあり、状況によってViewsフォルダ配下のDetailsPage.xamlとListPage.xamlを表示する。MainPage.xamlで注目してほしい箇所は2箇所ある。UserControlタグのDataContext属性にキー名LocatorというオブジェクトのMainというプロパティがBindingされている。LocatorはViewModelのインスタンスを管理するViewModelLocatorクラスで、App.xamlでインスタンス化されている。ViewModelLocator.csは下記の通り。以下、他のViewModel用のPropertyが続く}ViewModelごとに上記の記述が連なっていく。MainPage.xamlで定義したFrameのSourceにCurrentPageがBindingされている。CurrentPageプロパティが定義されているのはMainViewModelクラスになる。MainViewModel.csのコードは下記になる。}}MainViewModelはCurrentPageを変更することによりページの遷移の制御を行っている。Toolkitが提供してくれる通信用のクラスだ。Messengerはデフォルトで1つのインスタンスを提供してくれるので、ViewModelのBroadCastのテスト用途などで指定のMessengerを使いたい場合など以外はMessenger.Defaultプロパティを使えば良いだろう。Register関数でライブラリ標準のNotificationMessageを受け取るように指定している。今回はNotificationMessageに遷移先を渡すようにしているので、Registerを呼び出した際のコールバック内でNotificationを参照してCurrentPageを変更する。Targetも使用してどこに対してのメッセージなのかを識別するようにしたほうが良いだろう。いうのも、MessengerのSendとRegisterはGenericを使用してNotificationMessage以外にも任意の型を指定して簡単にメッセージを発信、受信することも可能だが、実際、データ型を指定してしまうとコードからどこの誰に対するメッセージなのかまったく識別できなくなってしまうし、また、メッセージ毎にメッセージ用のクラスを用意すると、それはそれで作りすぎるとかなりカオスな状態を引き起こしてしまう。そのため、Messengerの利用はプロジェクトの規模が大きくなればなるほど計画的に使用するべきだろう。標準のメッセージクラスは以下の通り。MessageBaseGenericMessage<T>NotificationMessageNotificationMessage<T>NotificationMessageActionNotificationMessageAction<T>DialogMessagePropertyChangedMessage<T>ListPage.xamlListPage.xamlもMainPage.xamlと同様にDataContextへViewModelLocatorを介してListPageViewModelクラスのBindingを行っている。リストの表示に選択機能は必要ないのでItemsControlでListPageViewModelのBushiListプロパティを単純に表示している。ListPage.xamlは下記の通り。</ItemsControl.ItemTemplate></ItemsControl>ListPage.xaml.csは下記の通り。}}BushiListは名前の通りBushiクラスのリストだ。それをItemsControlのItemsSourceとしている。注目して欲しいのはDataTemplate内のButtonの定義だ。ShowDetailsCommand}"といったような記述が可能なのだが、今回はItensControlのDataTemplate内ということで、個々のアイテムのDataContextはBushiになってしまう。そのため単純に前述の定義を行ってもListPageViewModel内で定義されたShowDetailsCommandプロパティは見つからない。SL4ではRelativeSourceがWPFほど強力ではないので、それを補うため今回は下記のブログポストで見つけたBindingHelperクラスを使用している。SilverlightCommandParameterにBindingのみを指定することで個々のアイテムのDataContextであるBushiを渡している。これを受けるのはPateListViewModelのShowDetailsCommandだ。ShowDetailsCommandはRelayCommandのGenericを使用してBushiクラスを受け取るようになっている。ShowDetailsCommand内で、BushiをMessengerでDetailsPageViewModelクラスへと発信している(実際にはTargetを設定していないのでBushiをRegisterしている対象へとばらまいている)。ついでNotificationMessageも発信して詳細ページへの遷移を促している。一点注目して欲しいのがIsInDesignModeだ。StudioのXamlビューで実際に動作させた場合と同等の画面確認が行えるようになっている。Blendとの親和性が高いことからBlendabilityが高いとも表現される。DetailsPage.xamlDetailsPage.xamlはGridタグでListPage.xamlで選択されたBushiの詳細を受け取り表示するだけである。戻るボタン押下時にListPage.xamlへの遷移をNotificationMessageを発信することによりMainViewModelへと通知している。DetailsPageViewModel.csの詳細はここまで説明してきたこととほぼ同じなので省略する。Toolkit版を解説してきた。Toolkitを使えばすぐにでもMVVMパターンで開発を行えるのが理解できたと思うし、容易に使える実感を持てたのではないだろうか。Blendとの親和性も高まる、ということが伝わったら幸いだ。Japanウェブアプリ、デスクトップアプリ、モバイルアプリ、ゲームなどを開発しています。