c# - TreeView不显示对象层次结构

标签 c# .net wpf treeview objectdataprovider

我在使用对象数据绑定(bind)创建 WPF TreeView 时遇到了一些严重的问题。

该应用程序是配置文件编辑器。我定义了一个对象结构,可以将其序列化为正确的 XML 格式。

我遇到的问题是格式化 TreeView 中显示正确层次结构的对象实例。 TreeView 只会渲染 Channel 节点,不会渲染其他任何东西。

public class Objects
{
    public List<Channel> Channels { get; set; }
}

public class Channel 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Reader Reader { get; set; }
    public Filters Filters { get; set; }
    public Router Router { get; set; }
    public Persister Persister { get; set; }
}

public class Filters : ArrayList
{
    public string StopOnFailure { get; set; }
}

public class Reader
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Channel 的所有子类都包含属性 IdName。 Filters 类是具有相同属性定义的其他类型的集合。

这是 XAML

 <Window.Resources>
    <ObjectDataProvider x:Key="data"/>
    <DataTemplate DataType="{x:Type ConfigurationEditor:Channel}">
        <WrapPanel>
            <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" />
            <TextBlock Text=" [" />
            <TextBlock  Text="{Binding Path=Id}" />
            <TextBlock Text="]" />
        </WrapPanel>
    </DataTemplate>
    <DataTemplate DataType="{x:Type ConfigurationEditor:Reader}">
        <TextBlock Text="{Binding Path=Name}"/>
    </DataTemplate>
</Window.Resources>
<Grid>
    <TreeView Margin="12,12,12,96" Name="treeView1" ItemsSource="{Binding Source={StaticResource data}, Path=Channels}">
    </TreeView>
</Grid>

创建数据实例的代码

Objects config;
var serializer = new XmlSerializer(typeof(Objects));
using (var stream = new FileStream(@"C:\test.xml", FileMode.Open))
{
    config = (Objects)serializer.Deserialize(stream);
}

var dp = (ObjectDataProvider)FindResource("data");
dp.ObjectInstance = config;

我看过无数的例子,但我仍然可以找出我做错了什么。感谢您的帮助。

更新:

<HierarchicalDataTemplate DataType="{x:Type ConfigurationEditor:Objects}" ItemsSource="{Binding Path=Channels}"/>
<HierarchicalDataTemplate DataType="{x:Type ConfigurationEditor:Channel}" ItemsSource="Binding Path=Reader}">
    <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>

<DataTemplate DataType="{x:Type ConfigurationEditor:Reader}">
    <TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>

TreeView 没有变化。经过此更改,我仍然只列出了 Channel,而没有其他内容。

最佳答案

扩展@Gimalay的答案,问题是TreeView不知道从哪里获取任何子节点的数据。您可以使用 HierarchialDataTemplate 而不是 DataTemplate 通知 TreeView:

<HierarchialDataTemplate DataType="{x:Type ConfigurationEditor:Channel}"
    ItemsSource="...">
    <WrapPanel>
        <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" />
        <TextBlock Text=" [" />
        <TextBlock  Text="{Binding Path=Id}" />
        <TextBlock Text="]" />
    </WrapPanel>
</HierarchialDataTemplate>

两者之间的主要区别在于 ItemsSource 属性。这是一个绑定(bind)表达式,它返回用作子节点的对象集合。

问题是您有几个属性可以从中获取 child ,而不仅仅是一个。您要么需要将它们全部组合到一个属性中,要么添加另一个返回所有子节点的属性。

最后,您需要为每个子项类型定义一个 DataTemplate,以便 TreeView 知道如何显示它们(您可以使用 HierarchialDataTemplate 也适用于子节点(如果它们又具有子节点)。

关于c# - TreeView不显示对象层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416568/

相关文章:

使用派生接口(interface)的 C# 接口(interface)实现

c# - WPF - 创建颜色网格

c# - wpf 中的 treeview 多重绑定(bind)

c# - 如果 wpf 应用程序没有响应,则自动重启

c# - Expression.MemberInit -- 最佳重载方法匹配有一些无效参数

C# list.Orderby 降序

c# - 为什么给int赋一个大于int的值默认不会抛出异常?

c# - .NET - 使用 AWS CDK 为 .NET 的低级 CloudFormation 资源构造标记 EC2 实例

c# - 如何在不更改单元格格式类型的情况下从 excel 中获取值?

c# - 展平 IEnumerable<string> - SelectMany 问题