• 【xamarin + MvvmCross 从零开始】三、MvvmCross 详解 (1)


    前言

    MvvmCross完全与Xamarin契合,也同样支持Android、iOS、WindowsPhone、WPF、WP8等多个平台,针对各个平台都有单独的实现。

    在前面的例子中,我们已经使用了MvvmCross,使用MvvmCross实现了ViewModel和View的数据绑定。这次我们要对MvvmCross的一些常用对象通过实例的代码进行说明。

    有兴趣的同学可以到MvvmCross的官方网站学习 https://mvvmcross.com/

    目前MvvmCross的最新版本为4.4.0,我们就以这个版本为大家做下讲解。

    MvvmCross类库说明

    类库名称

    说明

    MvvmCross.Core

    MvvmCross核心类库,实现核心对象、核心接口定义及实现。如MvxViewModel、MvxSetup等对象。

    MvvmCross.Platform

    MvvmCross平台类库,实现在公共的数据转换、Ioc、插件机制等。

    MvvmCross.Binding

    MvvmCross数据绑定实现程序集。实现通用的数据绑定,如Swiss、Tibet、Json、Fluent等多种数据绑定的解析。
    MvvmCross.Localization MvvmCross本地化程序集。
    MvvmCross.Ios 针对iOS平台的特定实现程序集,主要针对iOS平台的Controller、控件、对象进行封装。
    MvvmCross.Droid 针对Android平台的特定实现程序集,主要针对Android平台的Activity、Fragment、控件、对象进行封装。

    MvvmCross 常用对象

    MvxApplication

    MvxApplication做为MvvmCross的入口对象,必须声明在可移植应用程序集。也就是说是各个平台的实现都会依赖此对象。通常实现的方式为声明一个App对象,继承于MvxApplication。

    image

    Initialize方法,此方法必须进行重载,实现对应用程序的初始化。如在Ioc中注册服务对象和应用程序入口的ViewModel。

    LoadPlugins方法,实现对插件的加载。

    CreateDefaultViewModelLocator方法,通过重载此方法可实现自定义加载ViewModel。

    典型的App实现是这样的:

    using Acr.UserDialogs;
    using MvvmCross.Core.ViewModels;
    using MvvmCross.Platform;
    using MvvmCross.Platform.IoC;
    using XamarinSample.ViewModels;
    
    namespace XamarinSample
    {
        public class App : MvxApplication
        {
            public override void Initialize()
            {
                base.Initialize();
    
                // 注册所有的服务类
                CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();
                Mvx.RegisterSingleton(UserDialogs.Instance);
                RegisterAppStart<MainViewModel>();
            }
        }
    }
    

    MvxSetup

    MvvmCross是一个可灵活配置的框架,MvxSetup是所有配置信息的入口,可以通过重载方法的形式对MvvmCross进行配置。如替换Ioc控制、自定义加载第三方插件、增加自定义Convertion、自定义缓存等。

    由于不同的平台有不同的特性,所以Setup会根据不同的平台有特定的实现,如在Android平台上默认实现为MvxAndroidSetup,在iOS平台上则为MvxIosSetup,当我们需要对MvvmCross进行配置时,只需要根据平台的不同继承不同的对象,再通过重载方法就可以实现灵活的自定义了。

    image

    典型的Setup定义是这样的:

    using Android.Content;
    using JRYC.Mobile.Common.Utilities;
    using JRYC.Mobile.Droid.Extras;
    using JRYC.Mobile.Droid.Impl;
    using MvvmCross.Binding.Bindings.Target.Construction;
    using MvvmCross.Core.ViewModels;
    using MvvmCross.Droid.Platform;
    using MvvmCross.Droid.Shared.Presenter;
    using MvvmCross.Droid.Views;
    using MvvmCross.Platform;
    using MvvmCross.Platform.Converters;
    using MvvmCross.Platform.IoC;
    
    namespace JRYC.Mobile.Droid
    {
        public class Setup : MvxAndroidSetup
        {
            public Setup(Context applicationContext) : base(applicationContext)
            {
    
            }
            protected override IMvxApplication CreateApp()
            {
                return new App();
            }
    
            /// <summary>
            /// Fill the Binding Factory Registry with bindings from the support library.
            /// </summary>
            protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
            {
                registry.RegisterCustomBindingFactory<CheckableLinearLayout>("Checked",
                    x => new CheckableLinearLayout.CheckableLinearLayoutTargetBinding(x));
                registry.RegisterCustomBindingFactory<CheckableRelativeLayout>("Checked",
                    x => new CheckableRelativeLayout.CheckableRelativeLayoutTargetBinding(x));
                base.FillTargetFactories(registry);
            }
    
            /// <summary>
            /// This is very important to override. The default view presenter does not know how to show fragments!
            /// </summary>
            protected override IMvxAndroidViewPresenter CreateViewPresenter()
            {
                var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies);
                Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter);
                return mvxFragmentsPresenter;
            }
    
            protected override void FillValueConverters(IMvxValueConverterRegistry registry)
            {
                base.FillValueConverters(registry);
    
                registry.AddOrOverwrite("NullableBooleanToVisibility", new NullableBooleanToVisibilityConverter());
                registry.AddOrOverwrite("BooleanToVisibility", new BooleanToVisibilityConverter());
                registry.AddOrOverwrite("LogicNot", new LogicNotValueConvert());
                registry.AddOrOverwrite("DateTimeString", new DateTimeStringValueConvert());
            }
    
    
            protected override void InitializeIoC()
            {
                base.InitializeIoC();
    
                Mvx.RegisterSingleton<ICryptography>(new AndroidCryptography());
            }
        }
    }

    MvxViewModel

    在Mvvm框架中,ViewModel起到后台数据与表现层之间桥梁的作用。ViewModel主要实现对后台业务的调用以及客户端业务逻辑, View层通过对ViewModel对象的绑定实现数据的呈现。

    MvxViewModel主要方法:

    image

    InitFromBundle、ReloadFromBundle、SaveStateToBundle三个方法主要实现了实例支行时状态的保存及加载。

    InitFromBundle:实例初始化时,如何从内存初始化当前实例的数据。

    ReloadFromBundle:实例被激活时,如何从缓存重新加载数据。

    SaveStateToBundle:实例被切换到后台时,如何将当前状态保存到缓存。

    其基类的主要方法,实现了ViewModel之间导航的方法。

    image

    Close:关闭指定的ViewModel,一般是关闭当前ViewModel,Close(this)

    ShowViewModel:显示指定的ViewModel。MvvmCross会根据指定的ViewModel查找关联的View,并显示相应的View。

    Mvx

    Mvx是一个静态类,在MvvmCross框架是一个很重要的对象。实现了Ioc、异常工厂、调试信息工厂等。

    需要说明的是这里实现的Ioc是一个简化版本的Ioc,不支持泛型、不支持多对象导出,当有多个对象符合条件时,只会导出符合条件的第一个对象。

    注册对象时使用RegisterSingleton,当获取对象时使用CanResolve和Resolve方法实现对象的导出。

    image

    小结

    本小节对MvvmCross中常用的对象做了简单的说明。如有未尽之处或错误,请指教。

    下次我们讲一下MvvmCross的数据绑定。

    mywx

  • 相关阅读:
    java开发实战经典
    defer属性---->执行外部脚本
    深入理解JavaScript 模块模式
    JavaScript模块化开发一瞥
    缓存是新的内存
    php站点
    数据库
    .NET中使用Redis
    Scrum中的User Story
    如何编写敏捷开发中的user story
  • 原文地址:https://www.cnblogs.com/phoenixdong/p/6446042.html
Copyright © 2020-2023  润新知