MVVM模式澄清 - 视图之间的交互

3
我正在使用WPF并尝试以MVVM方式编程。
我明白每个视图都有自己的视图模型,这很好用。但我在管理视图之间的交互方面遇到了困难。
比如我有两个视图,View1和View2,每个视图都有自己的ViewModel,ViewModel1和ViewModel2。如果我在View1上有一个下拉框和一个按钮,那么正确的方法是什么呢?怎样才能在按下按钮后关闭第一个视图,通知第二个视图选择的内容,并显示第二个视图呢?这似乎不应该放在模型中,因为它是一个UI问题。ViewModel不应该知道如何打开和关闭WPF窗体(或者应该吗?)而且视图也不应该知道其他ViewModels的任何信息(或者应该吗?)
那么这些问题是如何解决的呢?简单来说:
1)如何在视图之间传递数据?
2)谁来管理视图的生命周期/可见性?
3个回答

1

这将取决于您是在进行视图模型还是视图优先处理,具体的实现细节将取决于您是否使用 MVVM框架。如果您没有使用框架,则强烈建议您开始使用一个。

在您的示例中,当按下按钮时,将调用 ViewModel1 上的方法。如果首先执行视图模型(我建议这样做),则会实例化 ViewModel2 的一个实例,并在此时将组合框选择传递给 ViewModel2 的构造函数。

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


1

对于第一点,您可以通过DataModel同步数据。只要每个视图共享相同的DataModel实例并且它实现了INotifyPropertyChanged,多个视图就可以同时更新。

您的第二个问题是一个设计问题,正如@devdigital所说,这取决于是先View还是先ViewModel。我会考虑引入一个控制器类,就像ASP.Net MVC工作方式一样,控制显示哪个视图。您可以在ViewModel上公开一个ViewClosed事件,控制器可以监听该事件,并根据您的工作流打开另一个视图。


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接