前言
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。
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進行配置時,只需要根據平台的不同繼承不同的對象,再通過重載方法就可以實現靈活的自定義了。
典型的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主要方法:
InitFromBundle、ReloadFromBundle、SaveStateToBundle三個方法主要實現了實例支行時狀態的保存及加載。
InitFromBundle:實例初始化時,如何從內存初始化當前實例的數據。
ReloadFromBundle:實例被激活時,如何從緩存重新加載數據。
SaveStateToBundle:實例被切換到后台時,如何將當前狀態保存到緩存。
其基類的主要方法,實現了ViewModel之間導航的方法。
Close:關閉指定的ViewModel,一般是關閉當前ViewModel,Close(this)
ShowViewModel:顯示指定的ViewModel。MvvmCross會根據指定的ViewModel查找關聯的View,並顯示相應的View。
Mvx
Mvx是一個靜態類,在MvvmCross框架是一個很重要的對象。實現了Ioc、異常工廠、調試信息工廠等。
需要說明的是這里實現的Ioc是一個簡化版本的Ioc,不支持泛型、不支持多對象導出,當有多個對象符合條件時,只會導出符合條件的第一個對象。
注冊對象時使用RegisterSingleton,當獲取對象時使用CanResolve和Resolve方法實現對象的導出。
小結
本小節對MvvmCross中常用的對象做了簡單的說明。如有未盡之處或錯誤,請指教。
下次我們講一下MvvmCross的數據綁定。