发布时间:2026/7/31 13:37:29
一步一步学习使用LiveBindings() LiveBindings与具有动态呈现的TListView 一步一步学习使用LiveBindingsLiveBindings与具有动态呈现的TListView引言什么是LiveBindings在Delphi和CBuilder的RAD开发中LiveBindings是一种强大的数据绑定框架。简单来说它就像一根“魔法导线”能自动将数据源如数据库、对象列表、内存数据集与UI控件如TListView、TLabel连接起来。当你修改数据时UI会自动更新反之操作UI也能同步数据。这一切无需编写繁琐的同步代码。今天我们将聚焦于LiveBindings与TListView的结合并实现一个“动态呈现”的例子——即列表项不仅能显示文本还能动态显示图片、进度条等复杂元素。想象一下一个待办事项列表每项有标题、完成进度条和状态图标这都能通过LiveBindings轻松实现。## 准备工作创建项目并添加控件在开始前请确保你安装了Delphi或CBuilder推荐10.3版本。我们将创建一个新的FireMonkeyFMX应用支持跨平台并加入以下控件- 一个TListView用于展示数据- 一个TPrototypeBindSource原型绑定源作为数据源- 一个TBindingsList绑定管理器这些控件在“LiveBindings”组件面板中。## 第一步理解LiveBindings的核心概念LiveBindings的核心是“绑定表达式”。你可以将控件的属性如TListView的ItemAppearance与数据源的字段如Name、Progress关联。例如BindSource1.Name会映射到列表项的标题。对于TListView我们需要设置其ItemAppearance为“动态呈现”模式如ListItemShowDetail或自定义模板这样才能容纳多元素。## 第二步配置数据源TPrototypeBindSourceTPrototypeBindSource是一个虚拟数据源可以快速生成测试数据。我们用它来模拟一个任务列表。1. 从组件面板拖入一个TPrototypeBindSource1到窗体。2. 双击它在“字段编辑器”中添加三个字段 -TaskName字符串类型任务名称 -Progress整数类型进度百分比 -IsComplete布尔类型是否完成3. 点击“生成数据”按钮它会自动创建一些示例记录。## 第三步设置TListView的动态呈现TListView默认显示简单文本但通过修改ItemAppearance属性它可以支持复杂布局。1. 选中ListView1在对象检查器中找到ItemAppearance属性。2. 将其设置为ListItemShowDetail或ImageListItemBottomDetail等取决于你的需求。3. 勾选ShowCheckboxes如果希望有复选框和SearchVisible搜索栏。这样列表项就能显示标题、副标题和图标了。## 第四步使用LiveBindings连接数据这是最关键的步骤。我们将使用TBindingsList和TBindExpression来绑定数据。1. 从组件面板拖入一个TBindingsList1。2. 双击它打开绑定编辑器。3. 点击“添加绑定”选择“控件”为ListView1属性为ItemAppearance注意实际上我们需要绑定的不是ItemAppearance而是数据内容。正确的做法是绑定到ListView1的Items属性但LiveBindings提供了更高级的方式——通过TBindList。注意TListView的LiveBindings通常通过TBindList进行。在FMX中我们可以直接将TPrototypeBindSource拖拽到ListView1上Delphi会自动创建绑定。但为了学习我们手动操作1. 在对象树中右键点击ListView1选择“LiveBindings Wizard…”。2. 选择“绑定到PrototypeBindSource”。3. 在向导中将字段映射 -TaskName→Text列表项标题 -Progress→Detail列表项副标题 -IsComplete→ImageIndex但这里我们需要自定义图像所以稍后处理向导会生成一个TBindList和多个TBindExpression。## 第五步实现动态呈现——显示进度条和图标默认的ListItemShowDetail只显示文本要显示进度条我们需要自定义ItemAppearance或使用ItemAppearanceObjects。这里我们采用更简单的方法通过事件OnUpdateObjects来动态修改控件。代码示例1动态添加进度条到列表项delphi// 在ListView1的OnUpdateObjects事件中procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);var ProgressBar: TProgressBar;begin // 查找是否已有进度条控件 ProgressBar : AItem.Objects.FindObjectTTProgressBar(ProgressBar); if ProgressBar nil then begin // 创建进度条 ProgressBar : TProgressBar.Create(AItem); ProgressBar.Name : ProgressBar; ProgressBar.Parent : AItem; // 设置位置和大小基于列表项布局 ProgressBar.Align : TAlignLayout.Bottom; ProgressBar.Height : 20; ProgressBar.Margins.Left : 50; // 留出图标空间 ProgressBar.Margins.Right : 10; ProgressBar.Margins.Bottom : 5; end; // 从数据源获取进度值这里需要绑定数据 // 注意实际开发中应通过LiveBindings传递数据 ProgressBar.Value : 50; // 示例值end;解释此代码在每个列表项渲染时被调用。我们检查是否已有进度条如果没有则创建并设置布局。Align : Bottom使其固定在底部。但这里硬编码了进度值下一步要用LiveBindings动态获取。## 第六步高级绑定——将数据传递给动态控件真正的动态呈现需要将数据源的字段值传递给动态创建的控件。我们可以通过TBindExpression或手动从数据源读取。这里使用TBindList的OnGetValue事件。代码示例2使用OnGetValue动态设置进度条值delphi// 在TBindList的OnGetValue事件中procedure TForm1.BindList1GetValue(Sender: TObject; AFieldName: string; var Value: TValue; var Handled: Boolean);begin // 当字段名为Progress时返回实际数据 if AFieldName Progress then begin // 假设当前项的数据来自TPrototypeBindSource Value : TPrototypeBindSource1.Current.FieldByName(Progress).AsInteger; Handled : True; // 表示已处理 end;end;// 然后修改OnUpdateObjects以使用此值procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);var ProgressBar: TProgressBar; ProgressValue: Integer;begin // 获取进度条 ProgressBar : AItem.Objects.FindObjectTTProgressBar(ProgressBar); if ProgressBar nil then begin // 通过LiveBindings获取当前项的进度值 // 这里使用BindList的FindBinding或直接访问数据源 ProgressValue : TPrototypeBindSource1.Current.FieldByName(Progress).AsInteger; ProgressBar.Value : ProgressValue; end;end;解释OnGetValue让我们可以拦截字段值请求从数据源返回真实数据。然后OnUpdateObjects读取该值并设置进度条。这样列表滚动时每个项都能显示正确的进度。## 第七步添加动态图标——根据状态显示不同图标类似地我们可以根据IsComplete字段显示“完成”或“未完成”图标。代码示例3动态设置图标delphiprocedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);var Image: TImage; IsComplete: Boolean;begin // 查找或创建图像控件 Image : AItem.Objects.FindObjectTTImage(StatusImage); if Image nil then begin Image : TImage.Create(AItem); Image.Name : StatusImage; Image.Parent : AItem; Image.Align : TAlignLayout.Left; Image.Width : 40; Image.Margins.Left : 10; end; // 从数据源获取状态 IsComplete : TPrototypeBindSource1.Current.FieldByName(IsComplete).AsBoolean; if IsComplete then Image.Bitmap : CheckmarkBitmap // 预加载的完成图标 else Image.Bitmap : UncheckedBitmap; // 未完成图标end;## 总结通过本文我们一步步学习了如何使用LiveBindings与TListView结合实现动态呈现的列表。关键点包括1.数据源配置TPrototypeBindSource提供测试数据字段映射到列表项属性。2.动态控件创建在OnUpdateObjects事件中按需创建TProgressBar、TImage等子控件。3.数据同步通过OnGetValue或直接访问数据源确保动态控件显示实时数据。4.灵活布局利用Align和Margins调整控件位置适应不同屏幕。LiveBindings的强大之处在于它自动处理了数据变化时的UI更新而动态呈现则让我们突破了纯文本列表的限制。你可以进一步扩展此模式比如添加按钮、评级控件等打造真正丰富的数据驱动界面。记住LiveBindings不是魔法而是优雅的架构。它让你专注于业务逻辑而把UI同步的重任交给框架。现在打开你的IDE动手尝试吧

相关新闻

2026/7/31 13:32:28

角色先活起来,故事才会跟上

最近做了两组赛博都市人物设定。一位银发、红瞳,穿着剪裁利落的黑色长外套,手里握着一根金属手杖;另一位短发、戴耳机,白色机能夹克里藏着随时在线的终端。她们没有名字,也还没有完整的剧情。但只要把两张设定图摆在一…

2026/7/31 13:32:28

java 的 System.getenv() 和System.getProperty()

在 Java 中,System.getenv() 和 System.getProperty() 是用于获取系统信息的两个常用方法,但它们获取的信息来源、用途和作用范围有着本质的区别。1. 核心区别概述System.getenv():用于获取操作系统级别的环境变量(Environment Va…

2026/7/31 14:27:34

Meta收购Moltbook:AI社交平台核心技术解析

1. 科技巨头布局社交赛道的战略解析当Meta宣布收购人工智能驱动的社交平台Moltbook时,这标志着社交网络行业正在经历第三次技术迭代。作为长期观察社交产品演进的从业者,我注意到这次收购与2012年Instagram收购案有着惊人的相似之处——都是在关键技术转…

2026/7/31 14:27:34

Python供应链攻击深度解析:从pytensorlite恶意包看开源安全防御

1. 事件背景与核心威胁剖析最近在Python开发者社区里,一个名为pytensorlite的库引发了不小的震动。如果你最近通过pip install pytensorlite安装了这个包,那么你的系统可能已经潜入了恶意代码。这不是一个普通的bug,而是一起典型的“供应链投…

2026/7/31 14:27:34

League Akari:英雄联盟LCU自动化工具完整指南

League Akari:英雄联盟LCU自动化工具完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于英雄联盟LCU …

2026/7/31 14:27:34

计算机毕业设计之基于springbootvue的浏阳特产售卖系统

在互联网技术与电子商务蓬勃发展的时代背景下,基于Spring Boot与Vue技术框架构建浏阳特产售卖系统具有重要研究意义。基于Spring Boot、Vue框架,采用Java语言开发的浏阳特产售卖系统,运用B/S架构设计,以MySQL数据库作为数据存储支…

2026/7/31 14:27:34

9款AI论文写作工具实测:专科生毕业论文高效指南

1. 项目概述作为一名经历过论文写作煎熬的过来人,我深知专科生在毕业论文写作过程中面临的困境。从选题迷茫到格式混乱,从文献匮乏到查重焦虑,每一个环节都可能成为压垮骆驼的最后一根稻草。今天我要分享的是9款AI论文写作工具的深度测评&…

2026/7/31 14:22:34

K8s 国产数据库日志持久化实战|日志不落盘、重启丢失彻底解决

摘要90% 的团队第一次容器化人大金仓 / 达梦时,都会踩日志丢失的坑:删个 Pod 运行日志全没了、审计日志断档过不了等保、归档打满拖垮数据库、主备切换后守护进程日志失联排障无据。很多人以为挂了数据盘就万事大吉,殊不知运行日志、审计日志…

2026/7/29 22:32:30

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/31 0:01:11

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:01:11

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:01:11

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:38:56

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…