4

それぞれ独自のビューを持つ2つのビューモデルがあります。

最初のビューモデルには、ビューによって表示される3つのプロパティがあります。

PolicyProvider

PolicyType

PolicyNumber

2番目のビューモデルには、そのビューによって表示されるプロパティが1つだけあります。

TypeOfInvestmentFund

との間には1対多の関係がPolicyTypeありますTypeOfInvestmentFund.

これらのビューモデルとそのビューは両方とも、親フォーム内のユーザーコントロールとして表示されています。

に使用できる選択肢は、他のビューでTypeOfInvestmentFundどちらPolicyTypeが選択されているかによって異なります。


私には、これら2つのビューモデルを組み合わせることができるように感じます。

a)それらは明らかにいくらか結合されています

b)コントロールは非常に小さくて単純なので、それらを結合しても複雑で管理しにくいオブジェクトは作成されません。

ただし、このデータはかなり無関係です。十分に無関係であるため、ユーザーはフォームの個別の部分にデータを表示する必要があります(したがって、個別のビューに配置されます)。

個人的には、これら2つのビューモデルを組み合わせ、2つの別々のビューを接続して異なる部分を表示する方が、2つのオブジェクト間の通信を管理するよりもはるかにオーバーヘッドが少ないと感じています。

ただし、Prism Event Aggregatorを使用して緩く結合されたイベントを作成することはできます。これを行ったことがない場合でも、管理するのはおそらくそれほど多くありません。これら2つのビューモデルを分離しておくと、関心の分離が維持されます。さらに、開発の後半でこの情報を必要とする他のコントロールが表示された場合、それらを吸収し続けることはできません。したがって、この段階でイベントアグリゲーターを開始すると、イベントが既にサブスクライブできるため、やり直しができなくなります。ビューモデルを組み合わせるだけでは、まだまだ手間がかかります。

これらの2つのうちどちらが「より正しい」ですか?判断の呼びかけは理解できますが、決められないので、決心するための意見を探しています。

4

3 に答える 3

3

ViewModelは、データではなくビューを反映します

ビューにPolicyとダイナミックTypeOfInvestmentFundが表示されている場合は、必ずViewModelに両方のオブジェクトが含まれている必要があります。

個人的には、ViewModelにPolicyモデルをViewに公開させ、、、、、およびのcontainプロパティPolicyModelProvider持たせます。TypeNumberInvestmentFund

次に、DataTemplatesを使用して、各オブジェクトの描画方法をWPFに指示できます。これを行う方法の概要を示す大まかな例を次に示します。

<DataTemplate DataType="{x:Type local:PolicyModel}">
    <StackPanel>
        <local:PolicyView />
        <ContentControl Content="{Binding InvestmentFund}" />
    </StackPanel>
</DataTemplate>

<DataTemplate DataType="{x:Type local:InvestmentFundA}">
    <local:InvestmentFundA />
</DataTemplate>

<DataTemplate DataType="{x:Type local:InvestmentFundB}">
    <local:InvestmentFundB />
</DataTemplate>

編集

PolicyTypeOfInvestmentが2つの別個のオブジェクトである場合、それらをModels別個に保ち、両方を同じに配置しViewModelます。Modelsデータをモデル化するViewModelsためのものであり、View

于 2012-01-04T15:40:07.243 に答える
1

このような問題は、データベースの正規化と非常によく似ていると思います。一方では、2つの別々のビューモデルを作成するのと同様に、正規化は良い習慣です。しかし同時に、ある程度の非正規化がパフォーマンスにも役立つことが知られています。

個人的には、これら2つのビューモデルを組み合わせ、2つの別々のビューを接続して異なる部分を表示する方が、2つのオブジェクト間の通信を管理するよりもはるかにオーバーヘッドが少ないと感じています。

そして、その声明はそれをすべて言います。2つのビューモデルを組み合わせることは「ベストプラクティス」とは見なされないかもしれませんが、私があなたから得ている感覚は、それがアプリケーションにとって理にかなっているということです(あなたが言及した結合と複雑さのレベルに基づく)。私は先に進んでそれらを組み合わせて、それがどのように機能するかを見守っていると思います。

于 2012-01-04T15:37:48.797 に答える
0

返信ありがとうございます。レイチェルズの提案(あなたの奥様に賛成)からたくさんのアイデアを得ましたが、どれもうまくいきませんでした。結局、プロジェクトマネージャーはそのアイデアを気に入らず、読みやすさとやり直しを防ぐためのより標準的なアプローチを実装することを望んでいるので、メッセージルートに移動します。

eventaggregatorの代わりに、親に子のPropertyChangedイベントをサブスクライブさせてから、Policy子のプロパティを変更しますTypeOfInvestment

ビューモデルのマージを実装できなかったのはちょっと残念です。それは私にとって本当に理にかなっているからです。

于 2012-01-05T08:37:00.250 に答える