WPF TreeView XAML HierarchicalDataTamplate

WPF TreeView XAML HierarchicalDataTamplate

我需要在 TreeView

中呈现数据
[XmlRoot("Tables")]
public class TablesXML
{
    public TablesXML()
    {
        StaticTablesGroups = new List<StaticTablesGroup>();
    }


    [XmlArray("StaticGroups")]
    [XmlArrayItem("StaticGroup", typeof(StaticTablesGroup))]
    public List<StaticTablesGroup> StaticTablesGroups { get; set; }

}

public class StaticTablesGroup
{
    public StaticTablesGroup()
    {
        GroupTables = new List<GroupTable>();
        SubGroups = new List<StaticTablesGroup>();
    }

    [XmlAttribute("Name")]
    public string Name { get; set; }

    //[XmlArray("StaticGroup")]
    [XmlElement("Table", typeof(GroupTable))]
    public List<GroupTable> GroupTables { get; set; }


    [XmlElement("StaticGroup")]
    public List<StaticTablesGroup> SubGroups { get; set; }
}

public class GroupTable
{

    [XmlElement("TableName")]
    public string Name { get; set; }
    [XmlElement("TableTag")]
    public string Tag { get; set; }
}

在 TablesViewModel 中我有一个 属性

public List<StaticTablesGroup> TreeData
{
    get
    {
        return _tables.StaticTablesGroups;
    }

    set
    {
        _tables.StaticTablesGroups = value;
        OnPropertyChanged("TreeData");
    }
}

里面XAML

<TreeView ItemsSource="{Binding TablesVM.TreeData}" helpers:TreeviewSelectedItemTracker.SelectedItemHolder="{Binding TablesVM, Mode=TwoWay}" >
    <TreeView.Resources>
        <HierarchicalDataTemplate  ItemsSource="{Binding  SubGroups}" DataType="{x:Type data:StaticTablesGroup}">
            <Label Content="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <DataTemplate  DataType="{x:Type data:GroupTable}">
            <Label Content="{Binding Path=Name}"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

XML数据

<?xml version="1.0"?>
<Tables>
    <StaticGroups>
        <StaticGroup  Name="StaticGroup1">
            <Table>
                <TableName>TableName1</TableName>
                <TableTag>TableTag1</TableTag>
            </Table>
            <StaticGroup Name="SubGroup">
                <Table>
                    <TableName>TableName2</TableName>
                    <TableTag>TableTag2</TableTag>
                </Table>
            </StaticGroup>
        </StaticGroup>
        <StaticGroup Name="StaticGroup2">
            <Table>
                <TableName>TableName3</TableName>
                <TableTag>TableTag3</TableTag>
            </Table>
        </StaticGroup>
    </StaticGroups>
</Tables>

树视图看起来像:

SubGroup 节点在 TreeView 中丢失。我应该向 HierarchicalDataTemplate 添加什么以显示任意数量的子组。嵌套子组的数量未知。

您的问题是 StaticTablesGroup class 有两个不同的子集合。这在 HierarchicalDataTemplate 中并不真正支持,但您可以使用将两个子集合合并为一个的转换器来解决此问题:

public class SourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        StaticTablesGroup stg = value as StaticTablesGroup;
        List<object> merged = new List<object>();
        if(stg.GroupTables != null)
            merged.AddRange(stg.GroupTables);
        if(stg.StaticTablesGroups != null)
            merged.AddRange(stg.StaticTablesGroups);

        return merged;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

<TreeView x:Name="tv" ItemsSource="{Binding TablesVM.TreeData}">
    <TreeView.Resources>
        <data:SourceConverter x:Key="conv" />
        <HierarchicalDataTemplate ItemsSource="{Binding Path=., Converter={StaticResource conv}}" 
                                  DataType="{x:Type data:StaticTablesGroup}">
            <Label Content="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type data:GroupTable}">
            <Label Content="{Binding Name}"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>