我正在使用WPF并试图以MVVM方式编程。
我理解每个视图都有自己的视图模型,这非常有效。我正在努力管理观点之间的互动。
假设我有两个视图,View1和View2,每个视图都有自己的ViewModel,ViewModel1和ViewModel2。如果我在View1上有一个组合框和一个按钮,关闭第一个视图的正确方法是什么,通知选择的第二个视图并在按下按钮后显示第二个视图?它似乎不应该进入模型,因为它是UI的东西。 ViewModel不应该知道如何打开和关闭WPF表单(或者应该如何?)并且视图不应该知道任何其他ViewModel(或者应该知道吗?)
那么这些问题是如何解决的?简而言之:
1)如何在视图之间传递数据?
2)管理视图的生命周期/可见性的内容是什么?
答案 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) 的示例应用程序展示了如何实现这些控制器。