Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么时候可以将2个viewmodel合并为1个而不是使用某种形式的viewmodel通信?_C#_Wpf_Mvvm_Inotifypropertychanged_Eventaggregator - Fatal编程技术网

C# 什么时候可以将2个viewmodel合并为1个而不是使用某种形式的viewmodel通信?

C# 什么时候可以将2个viewmodel合并为1个而不是使用某种形式的viewmodel通信?,c#,wpf,mvvm,inotifypropertychanged,eventaggregator,C#,Wpf,Mvvm,Inotifypropertychanged,Eventaggregator,我有两个viewmodels,每个都有自己的视图 第一个视图模型具有视图显示的3个属性: PolicyProvider PolicyType PolicyNumber 第二个视图模型的视图仅显示1个特性: TypeOfInvestmentFund 在保单类型和投资基金类型之间存在一对多关系。 这两个视图模型及其视图都显示为父窗体中的用户控件 投资基金类型的可用选项取决于在其他视图中选择的保单类型 对我来说,这两个视图模型可以组合在一起,因为 a)它们显然有些耦合 b)这些控件既小又简单

我有两个viewmodels,每个都有自己的视图

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

PolicyProvider

PolicyType

PolicyNumber
第二个视图模型的视图仅显示1个特性:

TypeOfInvestmentFund
保单类型
投资基金类型之间存在一对多关系。

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

投资基金类型的可用选项取决于在其他视图中选择的
保单类型


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

a)它们显然有些耦合

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

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

我个人认为,与管理两个对象之间的通信相比,组合这两个视图模型并将两个独立的视图连接到该模型以显示其不同部分的开销要小得多

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


以下哪一项“更正确”?我理解这是一个判断电话,但我无法决定,所以我正在寻找意见来帮助我下定决心。

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

我个人认为,与管理两个对象之间的通信相比,组合这两个视图模型并将两个独立的视图连接到该模型以显示其不同部分的开销要小得多


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

视图模型反映的是视图,而不是数据

如果您的视图显示一个
策略
和一个动态
投资基金类型
,那么无论如何,您的视图模型应该同时包含这两个对象

就我个人而言,我会让我的ViewModel向视图公开一个
策略
模型,并让
策略模型
包含
提供者
类型
编号
投资基金

然后我可以使用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
<代码>模型
用于为您的数据建模,而
视图模型
用于为您的
视图
建模。好的,谢谢您的回复。从Rachels的建议中得到了很多想法(女士,请投你一票),但没有一个能成功。最后,项目经理不喜欢这个想法,希望我实施一种更标准的方法来提高可读性并防止返工,所以我要从根本上解决这个问题

我不使用eventaggregator,而是让父对象订阅
策略
子对象的PropertyChanged事件,然后更改
投资类型
子对象的属性


我有点懊恼没有实现viewmodel合并,因为它对我来说更有意义。

如果我理解正确,你的建议是合并模型而不是viewmodels。这可能对我不起作用。你的回答在这个问题的上下文中完全有意义,但我认为我把这个例子简化了。所讨论的数据实际上不是视图和viewmodels使用的数据,而是有关视图的数据。我们正在为系统创建一个autosave,实际上我正在保存视图的状态,以便稍后加载。因为每个视图都可以独立运行(从这一次开始),所以我希望保留数据seperate@ExitMusic第一位仍然适用:如果视图包含两个不同的模型,则在ViewModel中同时包含这两个项目。通常,我每页都有一个视图,而不是每个模型都有一个视图。问题是,有一个视图包含
策略
,另一个单独的视图包含
类型的投资基金
。这两个视图都旨在能够独立使用。有一个父视图,其中嵌套了这些视图作为用户控件。我通常会将它们放在一个视图中,但我希望它们可以单独重用(有时您可能希望更改
策略
,但不使用
类型的投资基金
),因此它们将处于不同的视图中。我希望这是有意义的^ ^@ExitMusic lol我现在真的很困惑。你的问题似乎是问你是否应该合并这两个视图模型,但在你的评论中你是在说