2011-11-15 9 views
0

MVVMを使用してSilverlightアプリケーションでナビゲーションをサポートすることを真に切り離した方法を模索しています。私は、UIがViewModelから完全に分離されているため、アプリケーションが実際にUIなしで完全に実行できるように、パターンの「純粋な」実装をさらに進めようとしています。これを行うには、私はUIの心配なしにナビゲーションをサポートする必要があります。SilverlightのナビゲーションへのViewModelの第1のアプローチ

これを実現する方法(メッセージングなど)はありますが、ビューモデルをViewModelに「マッピング」して、ViewModelが適切なViewを表示できるようにする方法がありません。 "表示される"。しばらく前に記事を読んで、この問題の解決方法を説明していたが、もはやそれをオンライン上に置くことはできないようだ。

この記事を検索する方法を知っている人や、この問題を解決した経験がある人はいますか?

+1

Caliburn.Microをレスキューする... http:// caliburnmicro.codeplex.com/ CMは、この状況を処理するためのフレームワークとして特別に設計されています。これは、優れたViewModelの最初の実装フレームワークを提供します。彼らの例を見て、彼らが助けてくれるかどうかを見てください。 – EtherDragon

+0

私は、これを行うためのよりよい方法を調査しているオープンな研究プロジェクトを持っています。 [email protected]で私の電子メールを送ってください。私はあなたがこれまで持っているものを見せてくれるでしょう。 –

答えて

2

がそこでここでは、やってしまったものを私のやや長いったらしい説明です:

まず、ページ内蔵のナビゲーションフレームワークを使用することにしました。私たちには複数の理由がありましたが、組み込みであり、Windows 8のナビゲーションフレームワークでもあるため、このアプローチを試してみました。

私たちのアプリケーションでは、MVVM LightとMEFを使用しています。

この作業を行うために、Frameコントロールを含むアプリケーションシェル(UserControl)を作成しました。シェルのDataContextは、(String型の)単一のCurrentPageプロパティを公開するShellViewModelのインスタンスに設定されます。次に、FrameのSourceプロパティをCurrentPageにバインドします。このアプローチはレイチェルのアプリレベルのViewModelに似ています。

ShellViewModelは、CurrentPageChangedメッセージを受信するためにMessengerに登録します。メッセージが受信されると、CurrentPageプロパティが更新され、PropertyChangedイベントが発生し、UIが更新されます。このメッセージは、NavigationService(INavigationServiceを実装し、MEFを使用して注入/インポートされたもの)から発生します。

NavigationServiceは、宛先を表すViewModelの文字列名を受け入れるNavigateToメソッドを公開します。この名前は、MEFを使用してエクスポートされたときにViewModelに適用されたコントラクト名と一致し、ViewModelLocatorを使用してインスタンスをルックアップするために使用されます。

NavigateToメソッドでは、ViewModelLocatorを使用してViewModelインスタンスを取得し、現在のViewModel(存在する場合)でDeactivateを呼び出し、新しいViewModelでActivateを呼び出し、CurrentPageChangedメッセージを新しいビューの名前とともにaパラメータ。 Activate/DeactivateはViewModel上のヘルパーメソッドであり、ViewModelの移動時に必要なタスクを実行できます。

これはうまくいくように見え、すべてのナビゲーションがINavigationServiceとメッセージングを介してViewModelsから分離された非常にMVVM-ishの実装を提供します。

現在のところ、ViewModelの名前を表すためにコードで文字列定数を使用していますが、ビュー内の文字列をハードコードしてDataContextを設定しています。私はナビゲーション 'tooling'の一環としてDataContextを自動的に設定する方法を探しています。

私はこのアプローチは含めて、多数のソースから一緒に解析された(これらに限定されない)レイチェルと、以下のリンクされたことを言及する必要があります:

http://blogs.microsoft.co.il /blogs/eladkatz/archive/2011/01/25/adapting-silverlight-navigation-to-mvvm.aspx

http://blog.galasoft.ch/archive/2011/01/06/navigation- in-a-wp7-application-with-mvvm-light.aspx

http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html

1

通常、アプリ全体にはViewModelがあり、それにはCurrentPageとすべてのナビゲーションイベント処理が含まれています。 View

、私はそれがCurrentPageContentをバインドだとContentControlを使用し、もし興味があるなら、それは使用していますが、例hereは、ありますViewModel

いるため、表示するView判断するためにDataTemplateSelectorを使用DataTemplateSelectorの代わりにDataTemplates

関連する問題