10.【DevExpress MVVM】View的管理

完全依据MVVM的设计原则来构建的应用程序,会有多个独立的视图和视图模型,甚至还有的时候,还会来自不同的程序集。当您需要将应用程序引导到一个单独的模块时,MVVM框架需要知道,它应该要知道具体怎么显示视图。本文演示了在导航过程中传递所需视图的多种方法。

下面是可用的方法列表,依次从最简单的机制到最深入的机制。当应用程序需要导航到某个视图时,这些机制可以让您完全控制所发生的事情。您可以自由选择任何满足您需求的方法。

  1. 浏览应用程序视图的最快、最通用和最有效的方法是,使用[ViewType]属性注解标记它们。属性告诉框架哪个视图与目标视图模型相关。这种方法在第3课——导航和服务的教程中有更详细的描述。
  2. 所有DevExpress导航服务都是使用的DevExpress.Utils.MVVM.UI.IViewLocator 服务,来实现查找和管理所需的视图的。您可以自己创建的这种服务的实现,并注册它(本地或全局)以更改它与应用程序视图的工作方式。有关如何实现和注册自定义服务,请参阅服务主题。
  3. 如果不想实现自定义服务实现,可以将导航服务的实例转换为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();}
        }
    }
  4. 前一种方法是所需任务的全局解决方案——为整个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离线英文原版文档下载

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值