WPF TreeView绑定_Folder类实现层级文件夹浏览显示异常
WPF TreeView层级文件夹浏览器渲染异常修复
问题复现与根因
需求是基于自定义_Folder类实现层级文件夹展示,类定义如下:
Public Class _Folder Public Property Name As String Public ReadOnly Property SubFolders As List(Of _Folder) = New List(Of _Folder)() End Class
窗口加载时构造的测试数据代码:
Private Sub Test2_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded Dim lst As New List(Of _Folder) Dim str As _Folder = New _Folder() str.Name = "Client 1" For x = 1 To 10 Dim y As _Folder = New _Folder With {.Name = "Mandant " & x} str.SubFolders.Add(y) Next lst.Add(str) str = New _Folder() str.Name = "Client 2" For x = 1 To 10 Dim y As _Folder = New _Folder With {.Name = "Mandant " & x} str.SubFolders.Add(y) Next lst.Add(str) tvw.DataContext = lst End Sub
两次配置错误分别导致不同的异常效果:
- 初始XAML将
HierarchicalDataTemplate.DataType设置为内置TreeViewItem类型,和自定义_Folder类型不匹配,模板完全不生效,运行效果如下:
- 第二次修改将DataType修正为
local:_Folder,但错误把ItemsSource绑定到字符串类型的Name属性,没有绑定子文件夹集合SubFolders,导致展开箭头能显示但子项名称渲染异常,效果如下:
修复方案
- 首先在XAML文件头部添加
_Folder类所在命名空间的声明,将clr-namespace:后的值替换为你项目的实际命名空间:
xmlns:local="clr-namespace:你的WPF项目实际命名空间"
- 将TreeView的XAML配置替换为以下正确代码,核心是将
HierarchicalDataTemplate.ItemsSource绑定到SubFolders子集合属性:
<TreeView x:Name="tvw" ItemsSource="{Binding}" HorizontalAlignment="Left" Height="798" Margin="10,50,0,0" VerticalAlignment="Top" Width="600"> <TreeView.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type local:_Folder}" ItemsSource="{Binding SubFolders}"> <TextBlock Text="{Binding Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
层级模板使用要点:
HierarchicalDataTemplate的ItemsSource属性必须指定当前数据对象中用来生成子节点的集合属性,WPF会自动递归套用该模板渲染所有层级的节点,不需要额外手动处理展开逻辑。
内容的提问来源于stack exchange,提问作者MUnna
相关产品推荐
相关产品推荐

