当前位置: 首页 > news >正文

基于MVVM框架的XUUI MoreComplex案例

Tutorial_MoreComplex — 下拉框与 Lua 表格操作

与 HelloWorld 最大的不同:Dropdown 的 options 数据源

MoreComplex 引入了一个新组件Dropdown(下拉框),它需要两种数据:

数据作用消费方式
data.options下拉列表的选项内容DropdownOptionsAdapter(DataConsumer<LuaTable>)
data.select当前选中的索引(从 0 开始)DropdownAdapter(DataConsumer<int> + DataProducer<int>)

data.options 有什么用

data={options={'vegetables','meat'},-- 下拉列表显示的内容select=0,-- 当前选中第 0 项('vegetables')}

data.options是一个 Lua table,会被DropdownOptionsAdapter消费:

publicclassDropdownOptionsAdapter:AdapterBase<Dropdown>,DataConsumer<LuaTable>{publicLuaTableValue{set{Target.options.Clear();value.ForEach<int,string>((k,v)=>{Target.options.Add(newDropdown.OptionData(v));});}}}

引擎绑定时的数据流:

初始化: observe:getter("options")(data) → {'vegetables', 'meat'} → DropdownOptionsAdapter.Value = LuaTable → Dropdown 显示 "vegetables"、"meat" 两个选项 用户选中第二项 "meat": → DropdownAdapter.OnValueChange(1) ← 索引从 0 开始 → data.select = 1 写回响应式数据 → computed.message 里读取 options[data.select + 1] → "meat"

没有 BindTo,那怎么绑定的?

data.options并不需要写 BindTo 字符串。它的绑定是通过DropdpownOptionsAdapter 本身继承自 AdapterBase来完成的。

查看 AdapterBase.cs:

publicclassAdapterBase:MonoBehaviour{[TextArea]publicstringBindTo;}

所以 DropdownOptionsAdapter 也能设置 BindTo。实际上在场景中你需要给它设置BindTo = "options"。而data.select则由另一个 DropdownAdapter(同样挂载在 Dropdown 上)设置BindTo = "select"

注:Dropdown 组件上挂了两个适配器 — 一个 DropdownOptionsAdapter(BindTo = “options”)负责选项列表,一个 DropdownAdapter(BindTo = “select”)负责选中值和交互。


add_option 命令:为什么需要 observeable.raw

这是第二个关键不同。命令里操作 Lua 表格时有个坑:

add_option=function(data)localtmp=observeable.raw(data.options)-- 先解包成普通表table.insert(tmp,'Option #'..(#tmp+1))-- 操作普通表data.options=tmp-- 赋值回去,触发响应end,

为什么要 raw?

data.optionsobserveable.new()包装过,是个带 metatable 的响应式对象。Lua 的table.insert对这种表不生效(它操作的是 metatable 背后隐藏的_obj,不会触发 __newindex)。

所以步骤必须是这样:

data.options (响应式表) → observeable.raw() → tmp (普通 Lua 表,可正常操作) → table.insert(tmp, 'Option #3') → tmp = {'vegetables', 'meat', 'Option #3'} → data.options = tmp (赋值回去,触发 __newindex → UI 刷新)

如果跳过observeable.raw直接table.insert(data.options, ...),数据改了但 UI 不会更新。


场景设置要点

在 MoreComplex 场景的 Canvas 下,你需要:

GameObject适配器BindTo
DropdownDropdownAdapter"select"
DropdownDropdownOptionsAdapter"options"
TextTextAdapter"message"
Button(添加选项)ButtonAdapter"add_option"

下拉框绑定了两个适配器,一个管选项内容、一个管选中索引。


总结

概念说明
data.options下拉框的选项数据源,被 DropdownOptionsAdapter 消费
data.select选中索引,DropdownAdapter 双向绑定
observeable.raw()操作响应式 Lua 表前必须先解包,改完再赋回去
http://www.jsqmd.com/news/1158119/

相关文章:

  • 3dsconv:5分钟快速将.3ds游戏文件转换为CIA格式的终极指南
  • 影刀RPA Python操作MySQL数据库:从连接到增删改查完整实战
  • 智能体行业落地拆解:政务 / 制造 / 金融三大场景技术方案
  • 2026年7月最新长春江诗丹顿官方售后客服中心地址电话及服务网点分布 - 江诗丹顿服务中心
  • d3d8to9:终极解决方案让Direct3D 8经典游戏在Windows 10/11上重获新生
  • 大数据毕设选题推荐:基于 Django 的多源 IT 招聘数据整合分析系统的设计与实现 基于 Django 的应届生 IT 求职辅助分析系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • jdk1.8的hashmap扩容时会发生数据丢失吗,大家来看看我的说法对不对
  • x265 MotionEstimate::motionEstimate 深度源码拆解
  • 2026五大AI编程助手实战选型指南:Cursor/Copilot/Windsurf/Amazon Q/Claude Code深度对比
  • AI大模型应用开发实战:从架构设计到工程落地的完整指南
  • MTK Audio HAL 录音流程深度解析:从 AudioRecord.read() 到 ALSA pcm_read() 的 12 个关键步骤
  • 2026年7月最新天梭成都武侯吾悦广场维修保养服务电话 - 天梭服务中心
  • 文化信息差变现:从麻将教程站看垂直领域SEO与流量转化策略
  • HBM 3D堆叠制造:从TSV硅通孔到中介层封装的5大核心工艺解析
  • 【VMware Workstation NAT 网络配置指南】
  • Godot游戏导出全攻略:从预设配置到多平台发布实战
  • web课程设计
  • 10_Openclaw安全合规工具域详解
  • 2026年中山东地区专业中空板周转箱销售厂家综合解析 - 品牌鉴赏官2026
  • CTF 编码入门|Base64 进制转换
  • 受欢迎的西宁茂枫商混站
  • Agent时代:企业AI接入内部系统,安全可控才是王道!
  • 南京爱彼回收价格查询及靠谱平台实测排行(2026年7月最新数据) - 爱彼中国官方服务中心
  • Muse智能体化图像生成:工具调用与自我优化技术解析
  • LabelImg 1.8.6 迁移至 Label Studio:3步完成项目升级与数据格式转换
  • STM32F103 矩阵键盘驱动优化:4x4扫描代码从5ms延时降到1ms响应
  • AI 辅助 API 文档生成与维护:从代码注释到交互式文档的完整链路
  • 小米账号解锁限制解析:每月1台与每年4台的策略与应对方案
  • 朗姆酒:从甘蔗到酒杯,一种充满加勒比阳光的烈酒
  • 2026年7月最新温州万国官方售后维修服务网点地址与客服电话 - 万国中国官方服务中心