がそこでここでは、やってしまったものを私のやや長いったらしい説明です:
まず、ページ内蔵のナビゲーションフレームワークを使用することにしました。私たちには複数の理由がありましたが、組み込みであり、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
Caliburn.Microをレスキューする... http:// caliburnmicro.codeplex.com/ CMは、この状況を処理するためのフレームワークとして特別に設計されています。これは、優れたViewModelの最初の実装フレームワークを提供します。彼らの例を見て、彼らが助けてくれるかどうかを見てください。 – EtherDragon
私は、これを行うためのよりよい方法を調査しているオープンな研究プロジェクトを持っています。 [email protected]で私の電子メールを送ってください。私はあなたがこれまで持っているものを見せてくれるでしょう。 –