什么时候可以将2个视图模型组合成1而不是使用某种形式的viewmodel-viewmodel通信?

时间:2012-01-04 15:06:45

标签: c# wpf mvvm inotifypropertychanged eventaggregator

我有两个视图模型,每个模型都有自己的视图。

第一个视图模型有3个属性由视图显示:

PolicyProvider

PolicyType

PolicyNumber

第二个视图模型的视图只显示了一个属性:

TypeOfInvestmentFund

PolicyTypeTypeOfInvestmentFund.

之间存在一对多关系

这两个视图模型及其视图都显示为父窗体内的用户控件。

TypeOfInvestmentFund的可用选项取决于在其他视图中选择PolicyType


对我而言,感觉这两种视图模型可以合并,因为

a)他们显然有点耦合

b)控件既小又简单,连接它们不会创建复杂且无法管理的对象。

然而,这些数据相当无关;用户仍然希望数据在表单的单独部分中可见(因此放在单独的视图中)。

我个人认为将这两个视图模型相结合并具有两个单独的视图连接到它以显示它的不同部分比管理两个对象之间的通信要少得多。

然而,我可以使用Prism Event Aggregator创建松散耦合的事件,虽然我从未这样做过,但可能管理起来并不多,并且保持这两个视图模型分离会保留关注点。此外,如果在开发中稍后出现其他控件也需要此信息,我无法继续吸收它们,因此在此阶段启动事件聚合器将阻止返工,因为事件可用于订阅。仅仅结合视图模型还有更多的工作。

这两个中的哪一个'更正确'?我理解这是一个判断,但我无法决定,所以我正在寻找帮助我下定决心的意见。

3 个答案:

答案 0 :(得分:3)

ViewModel反映了View,而不是数据

如果您的视图显示Policy和动态TypeOfInvestmentFund,那么您的ViewModel应该同时包含这两个对象。

就个人而言,我希望我的ViewModel向视图展示Policy模型,并让PolicyModel包含ProviderTypeNumber的属性,和InvestmentFund

然后我可以使用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是两个独立的对象,我会将Models分开,并将它们放在同一个ViewModel中。 Models用于建模您的数据,ViewModels用于建模您的View

答案 1 :(得分:1)

我认为这类问题与数据库规范化非常相似。一方面,规范化是一种很好的做法,就像创建两个独立的视图模型一样。但与此同时,已知一定量的非规范化也有助于提高性能。

  

我个人觉得将这两个视图模型组合在一起并有两个单独的视图连接到它以显示它的不同部分比管理两个对象之间的通信要少得多。

这句话说明了一切。虽然结合两种视图模型可能不被视为“最佳实践”,但我从您那里得到的感觉是它对您的应用程序有意义(基于您提到的耦合和复杂程度)。我会说继续并将它们结合起来并密切注意它的表现。

答案 2 :(得分:0)

好的,谢谢你的回复。得到了一堆来自雷切尔斯建议的想法(为你们做主题),但没有人提出任何建议。最后,项目经理不喜欢这个想法,并希望我实现一个更标准的可读性方法并防止返工,所以我要去消息根目录。

而不是eventaggregator我只是让父订阅Policy子项的PropertyChanged事件,然后更改TypeOfInvestment子项的属性。

我有点沮丧我没有实现viewmodel合并,因为它对我来说真的更有意义。