【发布时间】:2018-12-08 08:49:05
【问题描述】:
所以我有一个可以正常工作的 treeView。但我的问题是我想显示不同类型的不同树,而不必为 XAML 中的每个场景创建一个。我知道如何从后面的代码中设置 listView 的内容,treeView 也可以吗?我现在的 treeView 如下所示,但显然只适用于 CAN-Message 类型的项目:
<TreeView TreeViewItem.Selected="OnItemSelected" MouseDoubleClick="Tree_MouseDoubleClick" Name="tree">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type srcM:CANMessage}" ItemsSource="{Binding Signals}">
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding Name}"/>
<TextBlock Text=" (0x"/>
<TextBlock Text="{Binding CANid}"/>
<TextBlock Text=")"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
问题是我有不同的场景。例如,我只想显示类型字符串的 ADTF 类(如下所示)的信号列表。 在另一种情况下,我想显示 CAN 类的 CANMessages 列表,并且对于每个消息元素,我想将其包含的信号列表设置为子元素(在 XAML 示例中实现)。我有以下这些类的简短版本:
public class ADTF : ISignalSource
{
public string Id { get; set; }
public List<string> Signals { get; set; }
}
和
public class CAN: ISignalSource
{
public string Id { get; set; }
public List<CANMessage> Signals { get; set; }
}
public class CANMessage
{
public string Id { get; set; }
public List<string> Signals { get; set; }
}
所以我认为我需要为每个场景创建一个 HierarchicalDataTemplate。但我想在后面的代码中执行此操作,因为它似乎比在 XAML 中为每个场景实现 HierarchicalDataTemplate 所需的代码更少。有没有办法解决这个问题?
【问题讨论】:
-
那么,您是否尝试过将您对 ListView 所做的事情应用到您的 TreeView 中?考虑到它们都是 ItemControls,它们的行为应该相似。
-
@Freggar 我试过了。但是我遇到的第一个问题是我不能从 HierarchicalDataTemplate 中取出数据类型。一旦我取出模板,列表就会保持空白(我想这是有道理的,因为我没有告诉它如何显示)有没有办法从代码后面设置 hirarchicalDatatemplate?
-
哦,也许我误解了你的问题。你想为不同的数据类型制作不同的模板吗?如果是这样,您可以在
TreeView.Resources内为不同的 DataTypes 定义多个HierarchicalDataTemplate。我很难理解你真正想要什么。 -
@Freggar 哦。这实际上可能是一个解决方案。我不知道你能做到这一点。我只想显示包含不同数据类型的树,而不必为每个场景实现单独的 treeView。不过,是否可以从 Code behind 生成 HierarchicalDataTemplate?抱歉,如果我的问题不清楚。
-
抱歉,我没有太多从后面的代码设置 DataTemplates 的经验,但我猜你可以。在后面的代码中设置它们可能更容易设置
ItemTemplate,而不是将子级添加到Treeview.Resources,因为这可能是静态链接的。也许像这样stackoverflow.com/questions/50597342/…?
标签: c# wpf data-binding treeview code-behind