澄清MVVM - 视图之间的交互

时间:2011-06-14 10:03:27

标签: mvvm

我正在使用WPF并试图以MVVM方式编程。

我理解每个视图都有自己的视图模型,这非常有效。我正在努力管理观点之间的互动。

假设我有两个视图,View1和View2,每个视图都有自己的ViewModel,ViewModel1和ViewModel2。如果我在View1上有一个组合框和一个按钮,关闭第一个视图的正确方法是什么,通知选择的第二个视图并在按下按钮后显示第二个视图?它似乎不应该进入模型,因为它是UI的东西。 ViewModel不应该知道如何打开和关闭WPF表单(或者应该如何?)并且视图不应该知道任何其他ViewModel(或者应该知道吗?)

那么这些问题是如何解决的?简而言之:

1)如何在视图之间传递数据?

2)管理视图的生命周期/可见性的内容是什么?

3 个答案:

答案 0 :(得分:1)

这将取决于您是在进行视图模型还是首先查看,具体的实现细节将取决于您是否使用MVVM framework。如果您没有使用框架,那么我强烈建议您开始使用框架。

在您的示例中,按下按钮时,将调用ViewModel1上的方法。如果首先进行视图模型(我建议),您将实例化ViewModel2的实例,此时您可以将组合框选择传递给ViewModel2的构造函数。

根据您的框架,将有不同的方式显示与ViewModel2相关联的视图。

答案 1 :(得分:1)

对于1),您可以通过DataModel同步数据。如果每个视图共享DataModel的同一个实例,并且它实现INotifyPropertyChanged,则可以模拟更新多个视图。

你的sesond问题是设计问题,因为@devdigital声明它可以取决于它是View first还是ViewModel。我会考虑引入一个Controller类,就像ASP.Net MVC控制哪个视图一样。您可以在ViewModel上公开控件可以侦听的ViewClosed事件,并根据您的工作流打开另一个视图。

答案 2 :(得分:1)

您可以考虑引入 Controllers ,它们负责ViewModel的生命周期管理。此外,它们在ViewModels之间进行调解。

WPF Application Framework (WAF) 的示例应用程序展示了如何实现这些控制器。