1

他の多くのビジネス オブジェクトで構築されたビジネス オブジェクトを表示したいシナリオがあるとします。つまり、階層が深いとします。

データを表示するには、masterDetail タイプのビューを使用したいと思いますが、多くのレベルを使用して、データをより深く掘り下げることができます。

したがって、オブジェクトのルートにあるリストから項目を選択し、そのプロパティの詳細ビューを表示してから、その詳細ビューから項目を選択してその詳細ビューなどを表示する必要があります。

データを操作していない場合は、モデルに直接バインドするだけでよいため、深い階層内のモデルごとに viewModel を作成する必要はありません。

データを操作する場合は、ビジネス オブジェクト全体とその子孫をビュー モデルでラップし、それにバインドして、特定のロジックを実行するコマンドを追加できるようにします。

しかし、特定のレベルでのみデータを操作したい場合はどうすればよいでしょうか? XAML や codeBehind からモデルを直接操作しようとすると面倒です。それでも、すべてを ViewModel でラップするのは大変な作業です。

特定の時点でビューモデルを作成するためにコンバーターを使用するだけだと考えています

<DisplayControl DataContext="{Binding A}">
   <DisplayControl DataContext="{Binding B}">
      <InteractionControl DataContext="{Binding C, Converter{ConvertModelToViewModel}}">
      </InteractionControl >
   </DisplayControl >
</DisplayControl >

しかし、それらのビューモデルでクリーンアップを実行する必要がある場合はどうすればよいでしょうか? イベントへの登録解除など。同じアイテムを行ったり来たりするたびに、同じモデルの新しいビューモデルが作成されます。ガベージ コレクションに依存したくありません。ビューモデルを保持することは、実行内容によってはコストがかかる可能性があり、GC も発生しない可能性があるためです (静的クラスのイベントに登録している場合など)。弱いイベントを使用すると GC に役立ちますが、高価な viewModel を必要以上に長く保持する場合には、それでも役に立ちません。

4

1 に答える 1

1

この質問は MVVM アプリケーションのアーキテクチャに言及しており、考慮すべき多くの側面があるため、一般的な答えを出すのは簡単ではありません。行う決定を整理し、いくつかのベスト プラクティスを提供することはおそらく役立つでしょう。これに対する答えは、スタイルと好みの問題を含むため、常に意見が分かれます...

実際の複雑な MVVM アプリケーションは、チュートリアルで無視されることが多いかなりのインフラストラクチャなしでは構築できません。特に、ビュー、ViewModel、モデルの構築、およびすべてを接着するために、多くの概念が利用可能です。

あなたが言及した問題に私がどのように対処したかについてのアイデアを提供します。

モデルに直接バインドすることはありません。ViewModel は、アプリケーションが成長するにつれてより複雑になる傾向があり、(モデルと比較して) 追加の論理的側面を含まない ViewModel は本当にごくわずかです。変更通知 (INotifyPropertyChanged) は別の側面です。変更通知が UI 目的でのみ必要である限り、この側面を ViewModel に分離することは理にかなっています。保守性とスケーラビリティのために余分な労力を費やすことをお勧めします。最初に何かを忘れたという理由だけで、主要なレッドサインを強いられることは望ましくありません。

ViewModel のコレクションとビューのコレクションの同期など、一般的な MVVM タスクを処理するインフラストラクチャを実装します。詳細については、こちらの回答を参照してください。私はViewModelの構築とキャッシングを扱うViewModelFactoryを構築することになりました。これにより、ViewModel のリサイクルも可能になります (不要になった ViewModel インスタンスを取得し、モデルを切り替えるだけです。リサイクル モードでの UI 仮想化と同様の概念です)。

もちろん、これはあなたの質問に対する完全な答えではありませんが、さらに先に進むのに役立つことを願っています. さらに具体的な質問がある場合は、お気軽にお問い合わせください。

于 2013-11-15T07:17:42.740 に答える