什么时候可以将2个视图模型合并为1,而不是使用某种形式的视图模型-视图模型通信
本文关键字:模型 视图 通信 2个 合并 什么时候 | 更新日期: 2023-09-27 18:19:37
我有两个视图模型,每个模型都有自己的视图。
第一个视图模型具有视图显示的3个属性:
PolicyProvider
PolicyType
PolicyNumber
第二个视图模型只有一个属性由其视图显示:
TypeOfInvestmentFund
PolicyType
和TypeOfInvestmentFund.
之间存在1对多的关系
这两个视图模型及其视图都显示为父窗体中的用户控件
TypeOfInvestmentFund
的可用选项取决于在另一个视图中选择了哪个PolicyType
。
对我来说,这感觉就像这两个视图模型可以组合在一起,因为
a)它们显然在某种程度上是耦合的
b)控件既小又简单,连接它们不会创建复杂且难以管理的对象。
然而,这些数据是完全不相关的;不相关,以至于用户仍然希望数据在表单的不同部分可见(因此放置在不同的视图上)。
我个人认为,将这两个视图模型结合起来,并让两个独立的视图连接到它来显示它的不同部分,比管理两个对象之间的通信要节省很多开销。
然而,我可以使用Prism Event Aggregator创建松散耦合的事件,尽管我从未这样做过,但可能管理起来并不多,将这两个视图模型分开可以保持关注点的分离。此外,如果其他控件在开发后期出现,也需要这些信息,我就无法继续吸收它们,所以在这个阶段启动事件聚合器可以防止返工,因为事件已经可以订阅了。这比仅仅组合视图模型还需要更多的工作。
这两项中哪一项"更正确"?我知道这是一个判断,但我无法做出决定,所以我正在寻找意见来帮助我下定决心。
ViewModel反映的是View,而不是Data
如果您的视图显示Policy
和动态TypeOfInvestmentFund
,那么您的ViewModel应该同时具有这两个对象。
就我个人而言,我会让我的ViewModel向View公开一个Policy
模型,并让PolicyModel
包含Provider
、Type
、Number
和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>
编辑
如果Policy
和TypeOfInvestment
是两个独立的对象,我会将它们的Models
分开,并将它们放在同一个ViewModel
中。Models
用于对数据进行建模,而ViewModels
用于对View
进行建模
我认为这样的问题与数据库规范化非常相似。一方面,规范化是一种很好的做法,创建两个独立的视图模型也是如此。但与此同时,已知一定数量的非规范化也有助于性能。
我个人认为,将这两个视图模型结合起来,并让两个独立的视图连接到它来显示它的不同部分,比管理两个对象之间的通信要节省很多开销。
这句话说明了一切。虽然组合这两个视图模型可能不被认为是"最佳实践",但我从您那里得到的感觉是,它对您的应用程序来说是有意义的(基于您提到的耦合和复杂性级别)。我想说的是,继续把它们结合起来,密切关注它的表现。
好的,谢谢您的回复。从拉切尔的建议中得到了很多想法(女士,投票支持你),但都没有成功。最后,项目经理不喜欢这个想法,希望我实现一个更标准的可读性方法,以防止返工,所以我要从根本上讲。
我只想让父级订阅Policy
子级的PropertyChanged事件,然后更改TypeOfInvestment
子级的属性,而不是事件聚合器。
我有点沮丧,我没有实现视图模型合并,因为它对我来说真的更有意义。