【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM