2012-01-04 8 views
4

私はそれぞれが独自の視点を持っている2つのビューモデルを持っています。何らかの形のviewmodel-viewmodel通信を使用する代わりに、2つのビューモデルを1つに結合するのはどうですか?

第一ビューモデルは、ビューによって表示される3つの性質を有する:

PolicyProvider 

PolicyType 

PolicyNumber 

第2のビューモデルは、そのビューで表示されている1つだけのプロパティがあります

TypeOfInvestmentFund 

を1がありますPolicyTypeTypeOfInvestmentFund.の間の多くの関係

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

TypeOfInvestmentFundの利用可能な選択肢は、で選択されたに依存します。これを組み合わせることができ、これらの2つのビューモデルのように感じている私に


、なぜなら

a)は、彼らが明確に多少のコントロールが両方とても小さくてシンプルな

B)を結合されているそれらを結合しても、複雑で管理不能なオブジェクトは作成されません。

ただし、このデータはかなり無関係です。ユーザは依然としてフォームの別々の部分にデータを表示したい(したがって別々のビューに配置する)ようには十分ではありません。

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

しかし、私はこれをやったことはありませんが、おそらくそれほど管理することはできません。これらの2つのビューモデルを別々に保つことは、懸念の分離を維持するでしょう。さらに、この情報を必要とする開発中に他のコントロールが表示された場合、その情報を吸収し続けることはできないため、この段階でイベントアグリゲータを開始すると、イベントが既に購読可能なのでリワークが防止されます。ビューモデルを組み合わせるだけで、まだまだ仕事が増えています。

これら2つのうちどれが「より正しい」ですか?私はその判断を求めることを理解していますが、私は決定できませんので、私は私の心を補うための意見を探しています。

答えて

0

ありがとうございました。レイチェルの提案(あなたのためにupvote)からアイデアの束を得たが、それらのうちのどれもパノラマ。最終的にプロジェクトマネージャーはこのアイデアが気に入らず、私が読みやすさと再作業を防ぐためのより標準的なアプローチを実装したいので、メッセージルートに行くつもりです。

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

私は実際に私にもっと意味をなさないように私はviewmodelマージを実装するために私はちょっと気が狂った。

1

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

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

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

+0

ありがとうございました。残念ながらパフォーマンスはここでは唯一の結論ではありません。私はこのプロジェクトの他の人と話をしました。彼女はこのアプローチの問題は拡張性であると言いました。私は、問題のポップアップが増えればビューモデルを統合し続けることはできません。これまでのところ、すべてのビューにはビューモデルがあり、誰かが後でそのコードを見ると混乱する可能性があるので、彼女はそれを壊したくありません。私はイベントアグリゲータを入れなければならないと思う。 –

3

AのViewModelはビューではなく、データ

を反映して、あなたのビューがPolicyとダイナミックTypeOfInvestmentFundを示した場合は、すべてのことで、あなたのViewModelは、それらのオブジェクトの両方を持つことを意味します。

個人的に私は私のViewModelがViewにPolicyモデルを公開していて、PolicyModelが、私はその後、各オブジェクトを描画する方法WPFを伝えるためにDataTemplatesを使用することができProviderTypeNumber、およびInvestmentFund

のプロパティが含まれている必要があります。ここではあなたがそれを行うだろうか概説ラフ例です:

<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はデータモデリング用ですが、はモデリング用ですView

+0

私が正しく理解している場合は、ビューモデルの代わりにモデルを組み合わせることをお勧めします。これはおそらく私にとってはうまくいきません。あなたの答えは質問の文脈で完全になりますが、私はその例をあまり単純化していないと思います。問題のデータは実際にビューとビューモデルが扱っているデータではありませんが、実際にはビュー**のデータです**。私たちはシステムの自動保存を作成しており、後で読み込むビューの状態を保存しています。そして、各ビューは独立しているので、データを別に保つ必要があります。 –

+0

@ExitMusic最初のビットはまだ適用する必要があります。ビューに2つの異なるモデルが含まれている場合、ViewModelに両方のアイテムがあります。通常、私は1つのビューをページごとに持っていますが、1つではありませんモデルごとのビュー – Rachel

+0

物事は、 'Policy'と別の**別々の**ビューに' TypeOfInvestmentFund'というビューがあります。どちらのビューも独立して使用できるようになっています。これらのビューがusercontrolとしてネストされた親ビューがあります。私は通常、両方のビューを1つのビューに入れますが、それらを別々に再利用できるようにしたいのです(時には 'Policy'を変更したいかもしれませんが、' TypeOfInvestmentFund'を使用しないでください)。私は意味があることを願っています^ _^ –

関連する問題