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

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。

《开源精选》是我们分享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 中连接在一起。

—END—

开源协议:MS-PL License

开源地址:https://github.com/MvvmCross/MvvmCross

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/76603.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信