将XAML项目迁移至VB.NET WinForms时TreeNode事件绑定错误修复
修复WinForms TreeNode迁移时的“Expression does not produce a value”错误
问题原因
将WPF项目迁移到VB.NET WinForms时,原WPF代码使用System.Windows.Controls.TreeViewItem.Expanded事件实现节点展开后的延迟加载逻辑。但WinForms的TreeNode类中没有名为Expand的事件——Expand是TreeNode的方法(用于主动触发节点展开),不是事件,因此执行AddHandler treeViewItem.Expand, AddressOf tvi_Expanded时会抛出“Expression does not produce a value”错误。
WinForms中与WPF Expanded事件对应的是AfterExpand事件(节点展开完成后触发),或BeforeExpand事件(节点开始展开前触发),这里选择AfterExpand匹配原WPF代码的触发时机。
修复方案
- 替换事件绑定目标:将
treeViewItem.Expand改为treeViewItem.AfterExpand - 修正事件参数类型:WinForms的
AfterExpand事件参数为TreeViewEventArgs,对应调整处理方法参数 - 保留原有业务逻辑:节点延迟加载逻辑无需修改
修改后的完整代码
Private Function AddDirectoryNode(parentItemCollection As TreeNode, directoryDetail As DirectoryDetail) As Boolean Dim treeViewItem As TreeNode treeViewItem = New TreeNode() treeViewItem.Tag = directoryDetail ' 替换为WinForms正确的AfterExpand事件 AddHandler treeViewItem.AfterExpand, AddressOf tvi_Expanded ' 如果目录包含子目录,添加占位节点 If (directoryDetail.SubDirectoryDetails.Count() > 0) Then treeViewItem.Nodes.Add(New TreeNode() With {.Name = "placeholder"}) End If ' 将节点添加到父节点集合 parentItemCollection.Nodes.Add(treeViewItem) Return True End Function ' 修正事件参数类型为TreeViewEventArgs Sub tvi_Expanded(sender As Object, e As TreeViewEventArgs) Me.ExpandNode(CType(sender, TreeNode)) End Sub Private Sub ExpandNode(tvi As TreeNode) If (tvi.Nodes.Count = 1 And CType(tvi.Nodes(0), TreeNode).Name = "placeholder") Then tvi.Nodes.Clear() For Each directoryDetail As DirectoryDetail In (CType(tvi.Tag, DirectoryDetail).SubDirectoryDetails.OrderBy(Function(x) x.Path)) Me.AddDirectoryNode(tvi.Nodes.Add(directoryDetail.Path), directoryDetail) Next directoryDetail End If End Sub
额外补充
若需要在节点展开前执行逻辑(比如显示等待光标),可改用BeforeExpand事件,示例:
Sub tvi_BeforeExpand(sender As Object, e As TreeViewEventArgs) Cursor.Current = Cursors.WaitCursor End Sub Sub tvi_AfterExpand(sender As Object, e As TreeViewEventArgs) Me.ExpandNode(CType(sender, TreeNode)) Cursor.Current = Cursors.Default End Sub
同时绑定BeforeExpand事件:AddHandler treeViewItem.BeforeExpand, AddressOf tvi_BeforeExpand
内容的提问来源于stack exchange,提问作者lemoncher2
相关产品推荐
相关产品推荐

