You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:05:18