【问题标题】:WPF databinding to a TreeView from Code behindWPF 数据绑定到来自后面代码的 TreeView
【发布时间】: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


【解决方案1】:

如果我理解正确,您可以使用Interface 来完成这项工作。

类似问题: wpf Treeview with three levels in

【讨论】:

  • 我认为这不适用于我的情况,因为我要显示的列表非常不同。
  • 我建议在 XAML 本身中执行此操作,而不是从后面的代码中执行此操作。您可以在CAN 类中引入readonly 属性以将信号作为格式化字符串返回。类似public class CAN: ISignalSource { public string Id { get; set; } public List&lt;CANMessage&gt; Signals { get; set; } public List&lt;string&gt; Signals { get; } } 或者您可以使用IValueConverter 来格式化您的CANMessage。有了这个,你可以对这两个类使用相同的Template
猜你喜欢
  • 2011-01-12
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2015-11-07
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多