zoukankan      html  css  js  c++  java
  • Caliburn Micro 框架 WP8使用研究(一)简介

    介绍

    MVVM的出现给WPF Silverlight程序定义了程序的框架,MVVM可以解决业务层和UI层的耦合问题,更多优点不再赘述。

    在WP手机端,很多工程也都采用MVVM进行架构,比较常见的工具集是MVVM Light Toolkit 。它被应用在很多已知WP项目中,也有一些自己实现的MVVM架构工具多数也都基于此。而我们今天要说的是Caliburn Micro这个用于MVVM架构的Framework。

       

    首先对比下MVVM Light Toolkit 和Caliburn Micro:

      

    MVVM Light

    Caliburn Micro

    View和ViewModel之间的通信

    事件:通过EventToCommand将View中的事件通过ICommand接口

    Binding到ViewModel中定义的Command上

    属性:Binding 到ViewModel中对应属性

    事件:通过Action直接关联View中的事件到ViewModel里的方法中无需在ViewModel中定义Command

       

    属性:根据命名协定自动Binding

    View和ViewModel之间如何Binding

    View 中绑定DataContext到 ViewModelLocator中的ViewModel

    根据命名协定(Conventions)自动找到View对应的ViewModel然后进行自动绑定

    ViewModel之间如何通信

    提供Messenger进行通信

    提供EventAggregator进行通信

    ViewModel中执行导航

    自定义NavigationService

    根据命名协定通过ViewModel找到View然后执行导航

    优点

    概念简单清晰,容易理解

    自动完成许多工作,大大降低开发人员编码量

    不足

    相比Caliburn Mirco实现相同逻辑需要的代码量更多

    学习成本较高,许多概念初次接触不容易掌握

       

    两者孰优孰劣不做过多分析,个人观点,虽然CM学习成本较高,但其提供了更多方便开发的功能,是团队的好选择。

       

    从Hello World开始

    让我们先从最简单的程序开始看下CM 框架的基本使用

       

    我们新建好WP8程序后在References里面可通过Nuget来添加Caliburn Micro:

       

       

    接下来我们要做的是将App.xaml.cs内的东西移除(没错,是移除,后面会详细介绍)之后App.xaml.cs看起来是这个样子

       

       

    之后我们在根目录下定义一个类,名字随意比如Bootstrapper之后添加如下内容:

    using System.Collections.Generic;
    
    using Caliburn.Micro;
    
    using CaliburnPractise.ViewModels;
    
       
    namespace CaliburnPractise
    {
    
      public class Bootstrapper:PhoneBootstrapper
      {
    
        private PhoneContainer _phoneContainer;
      
        protected override void Configure()
        {
          _phoneContainer = new PhoneContainer(RootFrame);
          _phoneContainer.RegisterPhoneServices();
        }
    
        protected override object GetInstance(System.Type service, string key)
        {
          return _phoneContainer.GetInstance(service, key);
        }   
    
        protected override IEnumerable<object> GetAllInstances(System.Type service)
        {
          return _phoneContainer.GetAllInstances(service);
        }
        
    protected override void BuildUp(object instance)     {       _phoneContainer.BuildUp(instance);     }
      } }

    分析:CM使用PhoneContainer作为容器来提供事例(此处涉及Dependency Inject以及Container的概念具体情况不在赘述,若不很清楚可查阅相关资料,在此不进行过多的解释)

    之前我们将App.xaml.cs中文件删除是因为PhoneBootstrapper对其进行了包装,PhoneBootstrapper内部对这些事件进行了接管。

       

    接下来我们需要在App.xaml中进行Bootstrapper的定义。

    如此Bootstrapper添加完毕。

       

    接下来我们在根目录下添加MainPageViewModel并在其中定义

    在MainPage.xaml中添加Textblock 并起名为Title

       

    在Bootstrapper的Configure中加入下面代码

       

    然后我们运行程序,便会看到神奇的事情,程序打开之后UI中的Title自动Binding了。

    CM自动完成了两件事情:

    1、根据命名协定自动对MainPage进行了DataContext的Binding,通过PhoneContainer找到

    对应的MainPage然后Auto Binding

    2、根据命名协定找到了ViewModel中名字为Title的属性,并自动Binding到Textbox的Text上。

       

    接下来我们在MainPageViewModel中添加一个函数试试:

    在View中加一个按钮名字叫做SayHello:

       

    之后运行,点击这个按钮,又是神奇的一幕,MessageBox弹出,SayHello被执行。

       

    分析:

    通过上面的例子我们可以看到,程序将UI代码和逻辑代码分开,而且我们并没有很多繁琐的工作,这些归功与CM内部命名协定机制,进行自动Binding帮助我们完成工作。很强大不是么?

       

    通过上面的小例子我们可以看出CM的优势和它的厉害之处,在后续文章中我会对其中的内容进行深入的分析。

       

       

    先提供一些地址供大家学习:

    官方文档:caliburnmicro.codeplex.com/documentation

    系列博客:wp.qmatteoq.com/first-steps-with-caliburn-micro-in-windows-phone-8-the-first-project/

       

    QQ交流群:182659848 欢迎加入进来一起探讨。

       

       

       

       

  • 相关阅读:
    WPF ComboBox 控件用法
    WPF 调试办法
    wpf Border 装饰控件用法
    创建型模式:抽象工厂(Abstract Factory)
    创建型模式:工厂方法
    使用FreeSpire.Doc不安装Office组件的情况下操作Word文件
    【算法一】布隆过滤器算法学习附维基百科详细说明PDF文件
    C# 读写锁解决多线程下并发写入文件报异常“文件正在由另一进程使用,因此该进程无法访问此文件”的解决办法
    多线程下System.Threading.Interlocked用法
    WPF程序内嵌CEF框架浏览网站
  • 原文地址:https://www.cnblogs.com/tianhonghui/p/3118648.html
Copyright © 2011-2022 走看看