質問

MVVMライトフレームワークとDIのUnityを使用しています。ネストされたビューがいくつかあり、それぞれが対応するViewModelにバインドされています。 ViewModelsは、Laurent BugnionがMVVMライトに入れたViewModellocatorのアイデアを介して、各ビューのルートコントロールデータコンテキストにバインドされています。これにより、静的リソースを介してビューモデルを見つけることができ、この場合は依存噴射フレームワークを介してビューモデルの寿命を制御できます。また、ビューモデルとそれらをバインドする方法に関するすべてを見るための式ブレンドも可能になります。

私が述べたように、意見には健康的な巣の用量がありますが、ビューモデルはお互いについて何も知りません。親ビューは、静的リソースViewModellocatorを介して対応するViewModelに結合します(Unityを使用してViewModelオブジェクトの構造と寿命を制御します)。その親ビューには、別のサブビューであるユーザーコントロールが含まれています。これは、ViewModellocatorを介して対応するViewModelも取得します。 ViewModelsには、互いに参照されていないか、互いに階層を把握していません。

したがって、ここでは、ビューモデルがメッセージングを介してどのように相互作用するかの例を示します。 viewmodelの観測可能な収集にコンボボックスデータバウンドを持っている親ビューがあります。コンボボックスのselectedItemは、ビューモデル上のプロパティにも(双方向)バインドされています。コンボボックスの選択が変更されると、これは他のビューやサブビューで更新をトリガーすることです。現在、MVVM Lightで見つかったメッセージングシステムを介してこれを達成しています。

それで、あるビューモデルから別のビューモデルに情報を取得するためのベストプラクティスは何だろうと思っていますか?この場合、Sub-viewModelsに渡すために必要なのは、基本的に、現在ログインしているユーザーを表すユーザーGUIDです。最上位の親ビュー(まあ、viewmodel)はこの情報を知っていますが、サブビューモデルにそれを降ろす方法はわかりません。

私が考えることができるいくつかの可能なアプローチ:

  • Sub-ViewModelは、親ビューが使用しているのと同じオブジェクトへの参照を静的リソースViewModellocatorに尋ねる必要がありますか?互いのプロパティを通過するビューモデルはあまりきれいではなく、不必要にそれらを結びつけるようです。

  • 私はすでにメッセージングを使用して、ユーザーがコンボボックスで新しいアイテムを選択し、それに応じて更新するサブビューを通知しています。ただし、コンボボックスで選択されているオブジェクトタイプは、サブビューが必要とするこのデータ値に実際には直接関係していません。

役に立ちましたか?

解決 2

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

私はこのスペースでよく知られているいくつかの名前とTwitterの会話をしました(Glenn Block、John Papa、およびRob Eisenberg)。彼らは訪問者のパターンのような多くのことを提案しましたが、VMの階層がなければそれがうまく機能するかどうかはわかりませんでした。これは、ViewModel-Firstアプローチとは対照的に、私のデザインがほぼビュー最初に最初になったためかもしれません。実行可能である可能性のある別の提案は、私のViewModellocatorと依存関係の注入を変更して、作成時にデータ値をサブVMに渡す機能を含めることです。 VMLの静的な性質のためにそれを想像するのに少し苦労しましたが、私が思いついたメッセージ要求ソリューションは、当面がより簡単で簡単になると判断しました。この状況に陥っているデータが多すぎると、ソリューションを再考する必要があるでしょう。

他のヒント

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

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

EAでこれを行うこともできますが、課題はメッセージのペイロードに十分な情報を渡すことであり、子どもたちがそれが気にするべきものであることを知っていることです。

VMロケーターに関しては、絶対にそうではありません! VMロケーターのものは、UIでバインディングするために厳しく(最適に)、そのコンテキストの外側にそれ自体を浮上させるべきではありません。

私の$ .02グレン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top