如何通过两个视图模型传递对象? Wpf MVVM

时间:2011-07-12 09:21:54

标签: wpf object mvvm viewmodel

我有一个主视图,你有一个对象,你可以改变该对象的属性。但是当你点击一个按钮时我有一个弹出窗口:高级属性。但是,您在弹出窗口中执行的这些更改也必须在主视图的对象中完成。

所以我也为弹出窗口实现了一个viewmodel。我可以在这里放一些代码,但这是没用的,因为我没有任何东西,只有2个视图模型与一些文本框绑定来改变该对象的属性。所以2个视图模型不能在同一个对象上一起工作(这是我应该做的事情)。

弹出窗口很难到达您在主视图中处理的对象。在某种程度上,我应该能够将您在弹出窗口中所做的更改传递到主视图(到同一对象)。谁知道怎么做?我正在寻找这个很长一段时间,但我真的不知道要解决或解决我的问题:( ..

4 个答案:

答案 0 :(得分:0)

您可以拥有一个包含所有必需属性的ViewModel(基本属性+您在详细视图中编辑的属性)。然后你可以将相同的ViewModel传递给弹出视图=>因此ViewModel对象实例是相同的,但两个视图略有不同,允许编辑不同的属性。

答案 1 :(得分:0)

您的视图模型操作的“域”或“业务”对象来自哪里?找到一种在视图模型之间共享此“源”的方法。

例如,如果您使用某种ORM,则可以实现(静态)域服务,您的视图模型会询问该对象。

示例:您的DomainService可以公开方法“GetPersonById(int id)”,它会将同一个对象返回给两个ViewModel。

答案 2 :(得分:0)

或者您可以将一个BusinessObject传递给两个ViewModel,每个BusinessObject都会显示该View所需的内容。这样,您可以在2个虚拟机上共享一个业务对象

答案 3 :(得分:0)

根据您的架构,有多种方法可以实现此目的。例如,如果您使用的是富域模型,则可能直接绑定到视图模型上公开的Model属性。在这种情况下,当您调用高级属性窗口时,可以将现有模型的实例传递给该视图模型。高级属性窗口中的更改将绑定到在原始窗口中打开的业务对象的同一实例。

或者,如果您使用的是贫血域模型,而您没有将模型直接暴露给视图,您仍然可以将模型的相同实例传递给新窗口,但使用中介模式(或任何其他模式)标准的视图间模型通信技术)在高级窗口关闭时通知原始窗口。在这种情况下,高级窗口将是发布者,而原始窗口将是订阅者。

通知后,原始窗口可以使其所有视图模型绑定无效,以便适当更新UI。