《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐MvvmCross 是一个跨平台的 MVVM 框架,使开发人员能够创建强大的跨平台应用程序。
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 或平台库,它们提供可重用的抽象或特定功能。
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 包。
安卓X
插件
数据绑定
核心 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