更新日期:2020年10月24日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]

索引

  • UI的数据驱动模式
  • 使用
    • 数据模型
    • BindableType可绑定数据类型
    • IDataDriver数据驱动器
    • DataBinding双向绑定
    • BindableSelectable特殊数据类型

UI的数据驱动模式

MVVM的基础特性是数据绑定,也可以在某种程度上称之为数据驱动,在最新版本中,框架的UI模块(当然还有实体模块、公共行为类、FSM模块等)支持数据驱动模式,所谓的数据驱动模式也即是UGUI控件数据模型双向绑定(这里不考虑单向绑定)。

双向绑定后,支持如下特性:

  • 在代码中任意位置更新数据模型的值,与其绑定的所有UGUI控件会自动更新显示(支持多个控件绑定至同一个数据);
  • 在代码中或手动修改了UGUI控件的显示值,与其绑定的数据模型值也会跟着同步更新。

使用

数据模型

1.新建数据模型:新建一个脚本,并继承至DataModelBase

    /// <summary>/// UI数据驱动测试模型/// </summary>public class UIDBUserModel : DataModelBase{}

2.填入数据:在数据模型中最好使用可绑定数据,好处是可以与UI控件进行绑定:

    /// <summary>/// UI数据驱动测试模型/// </summary>public class UIDBUserModel : DataModelBase{/// <summary>/// 姓名/// </summary>public BindableString Name = new BindableString();/// <summary>/// 年龄/// </summary>public BindableInt Age = new BindableInt();/// <summary>/// 力量/// </summary>public BindableFloat Power = new BindableFloat();/// <summary>/// 是否是神级角色/// </summary>public BindableBool IsGod = new BindableBool();/// <summary>/// 种族/// </summary>public BindableSelectable Race = new BindableSelectable(new string[] { "人族", "魔族", "神族", "龙族" });}

3.在环境中加载数据模型:在Main检视面板上的DataModel分栏,将刚才创建的数据模型加载进去,这样才能确保当前环境中存在该数据模型,且其在整个环境中是唯一的:

BindableType可绑定数据类型

在数据模型UIDBUserModel中,必须要使用可绑定数据类型来定义数据字段,才能绑定到相应的控件,比如我要定义一个string类型的数据,就必须使用对应的可绑定数据类型BindableString

    /// <summary>/// UI数据驱动测试模型/// </summary>public class UIDBUserModel : DataModelBase{/// <summary>/// 姓名/// </summary>public BindableString Name = new BindableString();}

常用的基础类型均有与其对应的可绑定类型,当然也支持自定义可绑定类型

IDataDriver数据驱动器

将任何一个普通的UI逻辑类转变为数据驱动模式,只需要使其实现接口IDataDriver就可以了:

 /// <summary>/// 数据驱动测试UI,实现接口IDataDriver后,此UI便成为数据驱动器/// </summary>public class UIDBTestPanel : UILogicResident, IDataDriver{//注意:必须启用自动化任务protected override bool IsAutomate => true;//other code......}

DataBinding双向绑定

然后便可以直接将指定的UGUI控件绑定至数据模型(支持多个控件绑定同一个数据),使用DataBinding特性标记即可,比如此处将_inputFieldName_textName绑定至数据Name

    public class UIDBTestPanel : UILogicResident, IDataDriver{[DataBinding("HT.Framework.Demo.UIDBUserModel", "Name")] private InputField _inputFieldName;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Name")] private Text _textName;}

绑定完成后数据Name的值将始终与控件_inputFieldName_textName的显示值保持同步:

  • 在代码中修改了Name的值后,UI界面会实时更新;
  • UI界面更改了数据值后,Name的值也会实时同步。

    定义更多的绑定控件:
 public class UIDBTestPanel : UILogicResident, IDataDriver{[DataBinding("HT.Framework.Demo.UIDBUserModel", "Name")] private InputField _inputFieldName;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Name")] private Text _textName;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Age")] private InputField _inputFieldAge;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Age")] private Text _textAge;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Power")] private Slider _sliderPower;[DataBinding("HT.Framework.Demo.UIDBUserModel", "Power")] private Text _textPower;[DataBinding("HT.Framework.Demo.UIDBUserModel", "IsGod")] private Toggle _toggleIsGod;[DataBinding("HT.Framework.Demo.UIDBUserModel", "IsGod")] private Button _buttonIsGod;}

UI界面如下,直接在界面上修改UI控件,便可以修改对应的数据值:

BindableSelectable特殊数据类型

BindableSelectable为可选数据类型,支持传入多个可选值,然后数据的真实值为多个可选值之一,此数据模型可以与DropDown控件进行绑定:

 public class UIDBTestPanel : UILogicResident, IDataDriver{[DataBinding("HT.Framework.Demo.UIDBUserModel", "Race")] private Dropdown _dropdownRace;}public class UIDBUserModel : DataModelBase{/// <summary>/// 种族/// </summary>public BindableSelectable Race = new BindableSelectable(new string[] { "人族", "魔族", "神族", "龙族" }, 2);}

UI界面如下:

【Unity】 HTFramework框架(三十九)UI的数据驱动模式,MVVM相关推荐

  1. 【Unity】 HTFramework框架(十九)ILHotfix热更新模块

    更新日期:2019年9月27日. Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 ILHotfix热更新模块简介 使用ILHotfix热更新 创建ILHotfix环境 创建 ...

  2. Unity SKFramework框架(十九)、POI 兴趣点/信息点

    目录 一.简介 二.使用说明 1.二维与三维的匹配 2.移除 3.UI分辨率 4.Camera相机 三.Example 示例 一.简介 POI可以理解为场景中的一些有意义的点,例如车站.商场.医院.监 ...

  3. 【js学习笔记三十九】简单工厂模式

    目录 前言 导语 代码部分 总结 前言 我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大 ...

  4. PyTorch框架学习十九——模型加载与保存

    PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...

  5. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  6. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 【正点原子MP157连载】第三十九章 LCD驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  8. NeHe OpenGL第三十九课:物理模拟

    NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切.   物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇 ...

  9. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

  10. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

最新文章

  1. windows mobile设置插移动卡没反应_ipad pro外接移动硬盘ipados
  2. 从C语言的角度重构数据结构系列(十二)-C语言判断语法详解(ifswitch)
  3. [BLE--Link Layer]物理信道
  4. java窗体添加背景图片_Java项目实战之实战之天天酷跑(四):游戏主界面
  5. 电子病历模板_年会献礼3:浮针专家平台病历撰写系统年会启动
  6. 传智168期JavaEE struts2杜宏 day32~day33(2017年2月15日23:27:09)
  7. 计算机维修案例分析题,14-15年春季高考信息技术题(组装维修部分)
  8. php制作学生卡片,PHP基础案例一:展示学生资料卡
  9. python 线性回归 统计检验 p值_PAST:最简便易用的统计学分析软件教程(一)软件基本信息介绍...
  10. 计蒜客挑战难题:简单斐波那契
  11. python可选参数和可变量参数_解析参数并构建值变量
  12. Yii2中Component和Object的使用方法
  13. 进程间通讯:实现基于多进程的文件拷贝
  14. 视频分辨率全表(101种)
  15. 安全优雅的RESTful API签名实现方案(手机端)
  16. 密歇根州立大学被黑 个人信息和社保号码被盗
  17. Firefly ROC-RK3328-PC 四核64位入门级Mini PC 官方教程矫正经验
  18. [74系列------74HC595]
  19. 盖茨将18亿美元股票转给梅琳达
  20. 腾讯云阿里云配置 mysql开放3306端口

热门文章

  1. 不定高度的slideUp动画效果
  2. distinct 和order by 冲突解决方案
  3. 【JAVAFX UI欣赏 之 滑条频谱】
  4. window.open在苹果手机上失效的问题
  5. Stop worrying and start living
  6. 输出纹波和纹波电流测试规范分享
  7. 如何清除电脑桌面图标蓝底
  8. 京享值超8万的京东钻石用户告诉你套路是这样的
  9. 我的木子走了,余生只剩下张长弓.....
  10. ARM内核矩阵计算教程(STM32)