我需要在 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>
TreeView 看起来像:
TreeView
中缺少SubGroup 节点。我应该向 HierarchicalDataTemplate
添加什么以显示任意数量的子组。嵌套子组的数量未知。
这里的问题是 StaticTablesGroup
类有两个不同的子集合。这在 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>
我是一名优秀的程序员,十分优秀!