国外都在用的跨平台MVVM框架-MvvmCross

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐MvvmCross 是一个跨平台的 MVVM 框架,使开发人员能够创建强大的跨平台应用程序。

国外都在用的跨平台MVVM框架-MvvmCross

MvvmCross 是一个跨平台的 MVVM 框架。它使开发人员能够在Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Xamarin.Forms、通用 Windows 平台 (UWP) 和 Windows Presentation Framework (WPF)上使用 MVVM 模式创建应用程序。这允许您在平台之间共享行为和业务逻辑,从而实现更好的代码共享。

功能特性
ViewModel 到 View 绑定使用自己的可定制绑定引擎,它允许您为自己的自定义视图创建自己的绑定定义
ViewModel 到 ViewModel 导航,帮助您分享有关如何以及何时导航的行为
通过依赖注入和属性注入实现控制反转
插件框架,可以让您插入很酷的东西,如 GPS 定位、本地化、传感器、绑定扩展和大量 3rd 方便插件选择
MvvmCross 为您提供的高级功能是:

MVVM 架构模式
导航系统
数据绑定
平台细节支持
控制容器反转和依赖注入引擎
很多常用功能的插件
单元测试助手
MvvmCross 概述
部署的 MvvmCross 应用程序由两部分组成:

“核心” – 包含所有 ViewModel、服务、模型和“业务”代码
“UI” – 包含与“Core”交互的视图和平台特定代码
或者,您可以将代码拆分为更多项目/程序集,以提高可重用性和解耦层。

对于多平台的应用程序,通常有:

一个“核心”项目,编写为 .NET 标准库
每个平台的“UI”项目,作为当前目标平台的本机项目编写。
(可选)一些其他项目,可能是 .NET Standard 或平台库,它们提供可重用的抽象或特定功能。

国外都在用的跨平台MVVM框架-MvvmCross

MvvmCross 应用程序如何启动
当 MvvmCross 应用程序启动时,实际情况如下:

平台启动过程触发。
在平台应用程序的构建中,Setup创建了 MvvmCross。
Setup分两步执行框架初始化 :InitializePrimary:在主同步上下文(又名主线程)上运行。初始化 IoC、Logging 机制等核心部分。InitializeSecondary:在后台运行(从不在主线程上)。构造一些其他平台服务,如绑定、App类和对其的调用Initialize。它最终注册 Views / ViewModels 查找。
调用时App.Initialize,您的应用程序应提供一个AppStart对象,该对象负责管理第一个导航步骤。Setup初始化的最后一步是调用AppStart.Startup(object hint).
AppStart.Startup(object hint)运行并显示您的应用程序的第一个 ViewModel / View。
注意:如果您想知道方法hint上的参数Startup,您可以使用它来将初始参数从您的平台项目传递到您的核心层。例如,在实现推送通知时非常有用。

MvvmCross“应用”类
MvvmCrossApp类不应与ApplicationDelegateiOS 中的,或与ApplicationAndroid 或 Windows 中的对象混淆。这些是原生的、SDK 提供的对象,而这一类旨在位于代码的公共部分。

App是否可以注册一个IMvxAppStart对象并将您自己的位注册到 IoC。这就是它通常的样子:

using MvvmCross.Ioc;

namespace MyName.Core
{
public class App : MvvmCross.Core.ViewModels.MvxApplication
{
public override void Initialize()
{
CreatableTypes()
.EndingWith(“Service”)
.AsInterfaces()
.RegisterAsLazySingleton();

        RegisterAppStart<ViewModels.MainViewModel>();
        // if you want to use a custom AppStart, you should replace the previous line with this one:
        // RegisterCustomAppStart<MyCustomAppStart>();
    }
}

}
在此代码片段中,第一行对 IoC 容器进行批量注册。它查看当前Assembly(“核心”程序集)并使用反射来注册所有Service以延迟构造的单例结尾的类。

视图模型
ViewModels是 MVVM 模式的关键对象。这些通常应该包含用于管理状态和操作的代码。顾名思义,ViewModel 是提供属性和要使用的命令的视图抽象。

使用 MvvmCross 时,所有的 ViewModel 都应该继承自MvxViewModel. 这些通常应该包含:

引发更改的 C# 属性
命令
用于管理操作的私有方法
这就是典型的ViewModel样子:

public class MainViewModel : MvxViewModel
{
public MainViewModel()
{
}

public override void Prepare()
{
    // This is the first method to be called after construction
}

public override Task Initialize()
{
    // Async initialization, YEY!

    return base.Initialize();
}

public IMvxCommand ResetTextCommand => new MvxCommand(ResetText);

private void ResetText()
{
    Text = "Hello MvvmCross";
}

private string _text = "Hello MvvmCross";
public string Text
{
    get { return _text; }
    set { SetProperty(ref _text, value); }
}

}
这MainViewModel有:

Text更改时引发PropertyChanged通知的属性
每当执行命令时都会ResetTextCommand调用的命令。ResetText()
MvvmCross 包
MvvmCross 是一个非常可扩展的框架。社区已经做了很多你可以使用的东西。在此页面上,您将找到当前可用的 MvvmCross nuget 包。

国外都在用的跨平台MVVM框架-MvvmCross

安卓X

国外都在用的跨平台MVVM框架-MvvmCross

插件

国外都在用的跨平台MVVM框架-MvvmCross

数据绑定
核心 Windows 数据绑定

C# 属性用于 View 和 ViewModel
单个 View 属性被“绑定” – 连接 – 到 ViewModel 属性
指定了一个模式,它给出了数据流的方向(单向、双向等)
可以选择使用 ValueConverter 指定 – 这也可以选择参数化
也可以选择在绑定失败时使用 FallbackValue 指定。
C# 属性和数据绑定

C# 属性用于 View 和 ViewModel 上的数据绑定。

在 ViewModel 上,这些属性通常如下所示:

private string _myProperty;
public string MyProperty
{
get => _myProperty;
set
{
_myProperty = value;
RaisePropertyChanged(() => MyProperty);
// take any additional actions here which are required when MyProperty is updated
}
}
注意: MvvmCross 提供了辅助方法来分配支持字段并PropertyChanged在检查值是否实际更改后触发事件。考虑使用SetProperty()这个,它存在于MvxViewModel和上MvxPropertyChanged。此模式使用本地私有支持变量来存储当前值,并依赖于RaisePropertyChanged向任何侦听视图发出值变化的信号。

数据绑定属性

使用上述 View 和 ViewModel 属性,通常使用 ViewModel C# 属性对 View 属性的值进行建模。

例如:

如果您的视图包含CheckBox具有IsChecked属性的
那么您的 ViewModel 可能包含一个属性:
private bool _rememberMe;
public bool RememberMe
{
get => _rememberMe;
set => SetProperty(ref _rememberMe, value);
}
那么绑定可能会IsChecked在 View 上与RememberMeViewModel 中连接在一起。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至22018681@qq.com 举报,一经查实,本站将立刻删除。

Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
森林服务号的头像森林服务号
Previous 2022年4月10日
Next 2022年4月11日

相关推荐

发表回复

Please Login to Comment