2011-06-14 50 views
3

我正在使用WPF并尝试编写MVVM方式。MVVM的澄清 - 视图之间的交互

我明白每个视图是如何拥有自己的视图模型的,并且这种模式效果很好。尽管如此,我正在努力管理视图之间的交互。

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

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

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

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

回答

1

这取决于您是在查看模型还是先查看,具体的实施细节取决于您是否使用MVVM framework。如果你不使用框架,那么我强烈建议你开始使用它。

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

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

1

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

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

1

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

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