gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:24:01 26 4
gpt4 key购买 nike

我在创建带有对象数据绑定(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)表达式,它返回一个对象集合以用作子节点。

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com