如何用List<Entry>填充TreeView并无重复显示层级属性
解决扁平Entry列表转WPF树形TreeView的问题
1. 构建层级数据模型
首先需要将扁平的Entry列表转换为树形层级结构的对象,每个层级节点包含下一级的子集合,这样才能适配TreeView的层级绑定需求:
// 层级节点模型类 public class BuildingNode { public string Name { get; set; } public List<FloorNode> Floors { get; set; } = new List<FloorNode>(); } public class FloorNode { public string Name { get; set; } public List<RoomNode> Rooms { get; set; } = new List<RoomNode>(); } public class RoomNode { public string Name { get; set; } public List<ProductNode> Products { get; set; } = new List<ProductNode>(); } public class ProductNode { public string Name { get; set; } }
2. 扁平数据转层级结构
编写转换方法,通过分组去重将原始List<Entry>转换为树形节点集合:
// 转换扁平Entry列表为层级节点集合 public List<BuildingNode> ConvertToHierarchicalList(List<Entry> entries) { var buildingNodes = new List<BuildingNode>(); // 按建筑分组 foreach (var buildingGroup in entries.GroupBy(e => e.Building)) { var building = new BuildingNode { Name = buildingGroup.Key }; // 按楼层分组 foreach (var floorGroup in buildingGroup.GroupBy(e => e.Floor)) { var floor = new FloorNode { Name = floorGroup.Key }; // 按房间分组 foreach (var roomGroup in floorGroup.GroupBy(e => e.Room)) { var room = new RoomNode { Name = roomGroup.Key }; // 添加产品并去重(.NET 6+支持DistinctBy) room.Products.AddRange(roomGroup.Select(e => new ProductNode { Name = e.Product }) .DistinctBy(p => p.Name)); floor.Rooms.Add(room); } building.Floors.Add(floor); } buildingNodes.Add(building); } return buildingNodes; }
3. XAML中配置TreeView绑定
通过HierarchicalDataTemplate为每个层级节点定义显示模板,并绑定子集合:
<TreeView x:Name="AssetTreeView"> <TreeView.Resources> <!-- 产品节点模板 --> <HierarchicalDataTemplate DataType="{x:Type local:ProductNode}" ItemsSource="{Binding}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> <!-- 房间节点模板 --> <HierarchicalDataTemplate DataType="{x:Type local:RoomNode}" ItemsSource="{Binding Products}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> <!-- 楼层节点模板 --> <HierarchicalDataTemplate DataType="{x:Type local:FloorNode}" ItemsSource="{Binding Rooms}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> <!-- 建筑节点模板 --> <HierarchicalDataTemplate DataType="{x:Type local:BuildingNode}" ItemsSource="{Binding Floors}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </TreeView.Resources> </TreeView>
4. 绑定数据源到TreeView
在代码后台将转换后的层级数据设置为TreeView的数据源:
// 假设entries是你的原始扁平Entry列表 var hierarchicalData = ConvertToHierarchicalList(entries); AssetTreeView.ItemsSource = hierarchicalData;
内容的提问来源于stack exchange,提问作者BG42331
相关产品推荐
相关产品推荐

