WinUI中如何实现包含不同父子节点的TreeView?
解决WinUI TreeView无法显示Wire子节点的问题
问题根源分析
你代码里存在三个关键问题导致Wire子节点无法显示:
- 属性名称不匹配:Silos类里的集合属性叫
WiresObservable,但XAML里绑定的是Wires,绑定路径错误 - Wire类无公开可绑定属性:Wire类只有私有字段
id和number,没有公开的可读属性,无法用于绑定显示 - 未定义子节点的DataTemplate:TreeViewItem没有指定Wire对应的渲染模板,即使绑定了集合也不知道如何展示子项
修正后的代码
1. 修正Silos类(对齐绑定属性名称)
public class Silos : BindableBase { private ObservableCollection<Wire> wires; // 确保属性名称和XAML绑定路径一致 public ObservableCollection<Wire> Wires { get => wires; set => SetProperty(ref wires, value); } // 补充Name属性(你XAML里绑定了该属性,原代码未显示) private string name; public string Name { get => name; set => SetProperty(ref name, value); } // 构造函数初始化集合,避免绑定到null public Silos() { Wires = new ObservableCollection<Wire>(); } }
2. 修正Wire类(添加公开可绑定属性)
public class Wire : BindableBase { private int id; public int Id { get => id; set => SetProperty(ref id, value); } private int number; public int Number { get => number; set => SetProperty(ref number, value); } }
3. 修正TreeView的XAML(添加子节点模板)
<TreeView x:Name="TreeSilos" SelectionMode="Multiple" ItemsSource="{x:Bind ViewModel.Siloses}"> <TreeView.ItemTemplate> <DataTemplate x:DataType="local:Silos"> <TreeViewItem ItemsSource="{x:Bind Wires, Mode=OneWay}" Content="{x:Bind Name}"> <!-- 定义Wire子节点的显示模板 --> <TreeViewItem.ItemTemplate> <DataTemplate x:DataType="local:Wire"> <!-- 自定义Wire的显示内容,可根据需求调整 --> <TextBlock Text="{x:Bind String.Format('编号: {0} | ID: {1}', Number, Id)}" /> </DataTemplate> </TreeViewItem.ItemTemplate> </TreeViewItem> </DataTemplate> </TreeView.ItemTemplate> </TreeView>
额外检查项
- 确认
ViewModel.Siloses是ObservableCollection<Silos>类型,且已正确填充数据 - 确认每个Silos对象的
Wires集合中已添加Wire实例
内容的提问来源于stack exchange,提问作者Maclay
相关产品推荐
相关产品推荐

