1

次のシナリオに対する(アーキテクチャの品質の観点から)最良のアプローチは何を提案しますか?

ModelViewA(親)-データを表示するにはModelViewBからのコレクションが必要です-コレクションが変更されていない場合でも、コレクションに複数回アクセスします

ModelViewB(子)-アイテムのコレクションを保持します。コレクションは概念的にModelViewBに属し、主にこの(モデル)ビュー内で変更されます。ただし、ModelViewAはコレクションを変更することもできます

私が採用している現在のアプローチは、ModelViewBにコレクションを作成し、ModelViewAに複製を作成することです。メッセージングバス(MMVM Lightツールキット)を使用して、ModelViewsに変更を相互に通知させます。ただし、重複したコレクションを保持して同期しているため、これは厄介な感じがします。むしろ、1つの場所にのみ配置し、ModelViewAとBの両方からアクセスしたいと思います。おそらく1つのModelViewを別の場所に注入することを考えていましたが、結合が増加し、MVVMパターンでは一般的に間違っていると感じます。参照を保持する静的ロケーター(これもMVVM Lightツールキットから)があるので、両方のModelViewへの静的参照を使用することもできます。それとももっと良い解決策がありますか?

ありがとう、

O

4

1 に答える 1

0

私は今これを(一種の)やっています。

ConsoleViewのUIに表示するために、実行からのイベントを記録および保存するConsoleViewModelがあります。当然、私のViewModelは、イベントを記録するためにこのコンソールと通信したいと考えています。

これを行うために、ViewModelsがイベントをコンソールに書き込むために使用できるメソッドを公開するインターフェイスを作成しました。

public interface IConsole
{
  void Info(string message);
  void Info(string messageFormat, params object[] args)
  // etc
}

私のConsoleViewModelはこのインターフェイスを実装し、他のすべてのViewModelは、コンソールへの書き込みに使用するIConsoleタイプのパブリックプロパティを公開します。

これを行う際に、ViewModelを合成する多くの方法を使用できます。DI、または単純なサービスロケーターを使用するか、(私が行ったように)リソースでそれらを定義することができます。

<Application.Resources>
    <ConsoleViewModel x:Key="ConsoleViewModel" />
    <DerpViewModel x:Key="Derp" 
        Console="{StaticResource ConsoleViewModel}" />
    <!--etc-->     
</Application.Resources>
于 2011-07-14T16:31:47.520 に答える