1

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で選択されているオブジェクトタイプは、サブビューが必要とするこのデータ値に直接関連しているわけではありません。

4

2 に答える 2

3

私はこれに対して基本的に2つのアプローチを見てきました。一般的なクロスVM通信の場合、イベントアグリゲーターパターンはうまく機能します。

ただし、VMの階層の場合は、Visitorパターンを使用する方がよい場合があります。訪問者を使用すると、階層を流れる情報を取得できます。たとえば、各子に親VMへの参照を自動的に与えることができます。

EAを使用してこれを行うこともできますが、課題は、メッセージのペイロードに十分な情報を渡して、子供たちがそれが気にかけるべきものであることを認識できるようにすることです。

VMロケーターに関しては、絶対にありません!VMロケーターは、UIでのバインドに厳密に対応しており、そのコンテキストの外に(最適に)表示されないようにする必要があります。

私の$.02グレン

于 2010-03-31T06:02:53.410 に答える
0

サブViewModelに必要な情報を要求するメッセージを公開させてから、親VMにそのメッセージタイプとキートークンをサブスクライブさせることにしました。このコミュニケーション手段を使いすぎたくないのですが、ビュー階層をプッシュダウンする方法を見つけるのに苦労しているいくつかのデータに対しては効果的だと思います。これまで、ほとんどのデータの受け渡しはすべてイベントに応答して行われていましたが、特にデータが取得された場合や、新しいビューの前に別の画面でイベントが発生した場合は、この方法ですべてのデータを渡すことができるわけではありません。データを受信するために構築され、読み取られます。

私はこの分野で有名な名前(Glenn Block、John Papa、Rob Eisenberg)とTwitterで会話しました。彼らはビジターパターンのような多くのことを提案しましたが、VMの階層がなければそれがうまくいくかどうかはわかりませんでした。これは、私のデザインがViewModelファーストのアプローチではなく、ほとんどView-Firstであったことが原因である可能性があります。実行可能だった可能性のある別の提案は、ViewModelLocatorとDependency Injectionの使用を変更して、作成時にデータ値をサブVMに渡す機能を含めることです。VMLの静的な性質のために、それを想像するのに少し苦労しました。そして、私が思いついたメッセージ要求ソリューションは、当面はより単純で単純であると判断しました。

于 2010-04-02T02:47:07.003 に答える