WebView2 BindDataUI 示例 - 双向数据绑定
概述
这是 cWebView2Host 最完整的数据绑定示例,演示 BindUI(UI -> 宿主)和 BindData(宿主 -> UI)的双向绑定系统,以及 SetData 推送数据到 DOM。
项目结构
下载源码 [ 注意:重新到bin目录注册 DLL 文件 ]
代码请到 VBMAN2 项目 demos/webview2/bindDataUI 目录获取。
bindDataUI/
├── Form1.frm # 主窗体,包含绑定逻辑和回调方法
├── www/
│ └── index.html # 测试用 HTML 页面(6 个测试区域)
├── vbman2_webview2.vbp # VB6 项目文件
└── vbman2_webview2.vbw # VB6 工作区文件核心代码解析
1. 声明与初始化(Form1.frm)
vb
Dim WithEvents wv As cWebView2Host
Private Sub Form_Load()
Set wv = New cWebView2Host
wv.Initialize Me.hWnd, App.Path & "\www"
End Sub使用 WithEvents 声明以接收 Ready 等事件。传入本地文件夹路径,自动映射为 WebView2 可访问的资源。
2. 绑定配置(wv_Ready 事件)
vb
Private Sub wv_Ready()
' === BindData: 宿主 -> UI ===
' 文本输入双向绑定
wv.BindData "name", "#name-input", "value"
wv.BindData "name", "#name-preview", "textContent"
' 复选框控制面板可见性
wv.BindData "enabled", "#toggle-enabled", "checked"
wv.BindData "enabled", "#settings-panel", "visible"
' 图片和计数器
wv.BindData "avatar", "#avatar", "src"
wv.BindData "count", "#msg-count", "textContent"
' CSS 类绑定(状态样式)
wv.BindData "statusOnline", "#status-dot", "class"
' HTML 内容绑定
wv.BindData "items", "#item-list", "innerHTML"
' === BindUI: UI -> 宿主 ===
wv.BindUI Me, "OnNameInput", "#name-input", EventName:="input"
wv.BindUI Me, "OnToggle", "#toggle-enabled", EventName:="change"
wv.BindUI Me, "OnIncMsg", "#btn-inc"
wv.BindUI Me, "OnResetMsg", "#btn-reset"
' === 推送初始数据 ===
wv.SetData "name", "张伟"
wv.SetData "enabled", True
wv.SetData "avatar", "https://api.dicebear.com/7.x/adventurer/svg?seed=Felix"
wv.SetData "count", "3"
Me.Caption = wv.DocumentTitle
End Sub3. UI 回调方法
vb
' 文本输入回调 — 实时更新预览
Public Sub OnNameInput(ByVal EventName As String, ByVal Detail As String)
Dim val As String
val = JsonValue(Detail, "value")
wv.SetData "name", val
End Sub
' 复选框切换回调
Public Sub OnToggle(ByVal EventName As String, ByVal Detail As String)
Dim checked As Boolean
checked = (InStr(Detail, """checked"":true") > 0)
wv.SetData "enabled", checked
End Sub
' 增加消息计数
Public Sub OnIncMsg(ByVal EventName As String, ByVal Detail As String)
Dim count As Long
count = Val(wv.JsProp("document.querySelector('#msg-count').textContent"))
wv.SetData "count", count + 1
End Sub
' 重置消息计数
Public Sub OnResetMsg(ByVal EventName As String, ByVal Detail As String)
wv.SetData "count", 0
End Sub4. JSON 辅助函数
vb
Private Function JsonValue(ByVal Json As String, ByVal Key As String) As String
Dim pos As Long
pos = InStr(Json, """" & Key & """:""")
If pos > 0 Then
pos = pos + Len(Key) + 3
Dim endPos As Long
endPos = InStr(pos, Json, """")
If endPos > 0 Then
JsonValue = Mid(Json, pos, endPos - pos)
End If
End If
End Function功能说明
文本双向绑定
- 输入框实时更新预览文本
- BindUI 捕获 input 事件 → SetData 回推数据 → BindData 更新 DOM
复选框控制可见性
- checkbox 的 checked 属性绑定
- 面板的 visible(自定义属性)绑定
- 一个数据键控制多个 DOM 元素
图片与计数器
- src 属性绑定动态图片 URL
- textContent 绑定计数器文本
CSS 类名绑定
- class 属性整体替换
- 用于切换状态样式
HTML 内容绑定
- innerHTML 绑定渲染 HTML 片段
- 适用于动态列表渲染
技术要点
- BindData 和 BindUI 必须在 wv_Ready 事件中执行,不能在 Form_Load 中
- 回调方法必须声明为 Public,签名必须为
(ByVal EventName As String, ByVal Detail As String) - 同一数据键可绑定到多个元素和属性,实现一对多更新
- Detail 是 JSON 字符串,需要手动解析,示例提供了简单的 JsonValue 辅助函数
- visible 是自定义属性,内部通过 JS 设置
style.display实现显示/隐藏
应用场景
- 数据录入表单的实时预览
- 设置面板的开关控制
- 动态数据展示仪表盘
- 任何需要 VB6 与 Web UI 深度交互的场景
扩展建议
- 使用 SetDataBatch 批量推送初始数据,减少多次 JS 调用
- 对于复杂 JSON 解析,可集成 JSON 库替代手动字符串处理
- 实现服务端数据加载后通过 SetData 更新 UI,构建完整的数据驱动界面