UnityforDIだけでなくMVVMLightフレームワークも使用しています。ネストされたビューがいくつかあり、それぞれが対応するViewModelにバインドされています。ViewModelsは、LaurentBugnionがMVVMLightに組み込んだViewModelLocatorのアイデアを介して、各ビューのルートコントロールDataContextにバインドされます。これにより、静的リソースを介してViewModelを検索し、依存性注入フレームワーク(この場合はUnity)を介してViewModelの有効期間を制御できます。また、Expression Blendで、ViewModelとそれらをバインドする方法に関するすべてを確認できます。
私が述べたように、ビューには健全なネストがありますが、ViewModelは実際にはお互いについて何も知りません。親ビューは、静的リソースViewModelLocator(Unityを使用してViewModelオブジェクトの構築と存続期間を制御する)を介して対応するViewModelにバインドします。その親ビューには、別のサブビューであるユーザーコントロールが含まれています。このサブビューは、ViewModelLocatorを介して対応するViewModelを取得します。ViewModelは相互に参照を持たないか、相互に関連する階層を認識していません。
これが、ViewModelがメッセージングを介してどのように相互作用するかの例です。ViewModelのObservableCollectionにComboBoxデータバインドされた親ビューがあります。ComboBoxのSelectedItemも、ViewModelのプロパティに(双方向で)バインドされます。ComboBoxの選択が変更されると、これは他のビューとサブビューの更新をトリガーします。現在、MVVMLightにあるメッセージングシステムを介してこれを達成しています。
では、あるViewModelから別のViewModelに情報を取得するのがベストプラクティスになるのではないかと思います。この場合、sub-ViewModelsに渡す必要があるのは、基本的に、現在ログインしているユーザーを表すユーザーGUIDです。最上位の親ビュー(まあ、ViewModel)はこの情報を知っていますが、それをサブViewModelsに取り込む方法がわかりません。
私が考えることができるいくつかの可能なアプローチ:
サブViewModelは、静的リソースViewModelLocatorに、親ビューが使用しているのと同じオブジェクトへの参照を要求し、その方法でプロパティにアクセスする必要がありますか?互いのプロパティを通過するViewModelはあまりクリーンではなく、不必要にそれらを結合しているようです。
私はすでにメッセージングを使用して、ユーザーがComboBoxで新しいアイテムを選択したことをサブビューに通知し、それに応じて更新しています。ただし、ComboBoxで選択されているオブジェクトタイプは、サブビューが必要とするこのデータ値に直接関連しているわけではありません。