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

本文关键字:模型 视图 通信 2个 合并 什么时候 | 更新日期: 2023-09-27 18:19:37

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

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

PolicyProvider
PolicyType
PolicyNumber

第二个视图模型只有一个属性由其视图显示:

TypeOfInvestmentFund

PolicyTypeTypeOfInvestmentFund. 之间存在1对多的关系

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

TypeOfInvestmentFund的可用选项取决于在另一个视图中选择了哪个PolicyType


对我来说,这感觉就像这两个视图模型可以组合在一起,因为

a)它们显然在某种程度上是耦合的

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

然而,这些数据是完全不相关的;不相关,以至于用户仍然希望数据在表单的不同部分可见(因此放置在不同的视图上)。

我个人认为,将这两个视图模型结合起来,并让两个独立的视图连接到它来显示它的不同部分,比管理两个对象之间的通信要节省很多开销。

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

这两项中哪一项"更正确"?我知道这是一个判断,但我无法做出决定,所以我正在寻找意见来帮助我下定决心。

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

ViewModel反映的是View,而不是Data

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

就我个人而言,我会让我的ViewModel向View公开一个Policy模型,并让PolicyModel包含ProviderTypeNumberInvestmentFund 的属性

然后我可以使用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 进行建模

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

我个人认为,将这两个视图模型结合起来,并让两个独立的视图连接到它来显示它的不同部分,比管理两个对象之间的通信要节省很多开销。

这句话说明了一切。虽然组合这两个视图模型可能不被认为是"最佳实践",但我从您那里得到的感觉是,它对您的应用程序来说是有意义的(基于您提到的耦合和复杂性级别)。我想说的是,继续把它们结合起来,密切关注它的表现。

好的,谢谢您的回复。从拉切尔的建议中得到了很多想法(女士,投票支持你),但都没有成功。最后,项目经理不喜欢这个想法,希望我实现一个更标准的可读性方法,以防止返工,所以我要从根本上讲。

我只想让父级订阅Policy子级的PropertyChanged事件,然后更改TypeOfInvestment子级的属性,而不是事件聚合器。

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