完全依据MVVM的设计原则来构建的应用程序,会有多个独立的视图和视图模型,甚至还有的时候,还会来自不同的程序集。当您需要将应用程序引导到一个单独的模块时,MVVM框架需要知道,它应该要知道具体怎么显示视图。本文演示了在导航过程中传递所需视图的多种方法。
下面是可用的方法列表,依次从最简单的机制到最深入的机制。当应用程序需要导航到某个视图时,这些机制可以让您完全控制所发生的事情。您可以自由选择任何满足您需求的方法。
- 浏览应用程序视图的最快、最通用和最有效的方法是,使用[ViewType]属性注解标记它们。属性告诉框架哪个视图与目标视图模型相关。这种方法在第3课——导航和服务的教程中有更详细的描述。
- 所有DevExpress导航服务都是使用的DevExpress.Utils.MVVM.UI.IViewLocator 服务,来实现查找和管理所需的视图的。您可以自己创建的这种服务的实现,并注册它(本地或全局)以更改它与应用程序视图的工作方式。有关如何实现和注册自定义服务,请参阅服务主题。
- 如果不想实现自定义服务实现,可以将导航服务的实例转换为DevExpress.Utils.MVVM.UI.IViewService接口。例如,在下面的代码中,DocumentManagerService服务是现成的。
var service = DevExpress.Utils.MVVM.Services.DocumentManagerService.Create(tabbedView1); var viewService = service as DevExpress.Utils.MVVM.UI.IViewService; mvvmContext1.RegisterService(service);
然后,处理QueryView事件,该事件允许您根据所需的视图类型动态分配视图。
viewService.QueryView += (s, e) => { if(e.ViewType == "View1") e.Result = new Views.View1(); //... };
所需的视图类型是手动指定的。例如,您可以拥有以下导航视图模型,它将所有可用视图枚举为模块集合中的项。
public class MyNavigationViewModel { protected IDocumentManagerService DocumentManagerService { get { return this.GetService<IDocumentManagerService>(); } } //列出所有可用的视图类型 public string[] Modules { get { return new string[] { "View1", "View2", "View3" }; } } //为了创建和显示文档,将此命令绑定到它所需的UI元素上 public void Show(string moduleName) { var document = DocumentManagerService.CreateDocument(moduleName, null, this); if(document != null) { document.Title = moduleName; document.Show();} } }
- 前一种方法是所需任务的全局解决方案——为整个IViewService触发QueryView事件。您还可以使用由各个视图控件提供的API, DocumentManagerService是基于这些API的。
例如,如果你的视图是作为DocumentManager的选项卡打开的,你可以处理BaseView。事件来填充这些文档。本例中的视图类型存储为文档的BaseDocument.ControlName属性值。var service = DevExpress.Utils.MVVM.Services.DocumentManagerService.Create(tabbedView1); mvvmContext1.RegisterService(service); tabbedView1.QueryControl += (s, e) => { if(e.Document.ControlName == "View 2") e.Control = new Views.View2(); //... };
【DevExpress MVVM】中文翻译系列.文章目录
DevExpress.WindowsForms.v20.1.chm离线英文原版文档下载