【问题标题】:HierarchicalDataTemplate issue分层数据模板问题
【发布时间】:2012-05-09 11:41:48
【问题描述】:

我需要一些有关 HierarchicalDataTemplate 的帮助... 我正在尝试构建一个 TreeView 来显示一些分层数据 像这样:

  • 规则集
  • 规则 B
    • 规则C
    • 规则A .....
  • 规则

RuleA, ... 源自具有

  • 类型
  • RuleBase[] 规则

规则集有

  • 姓名
  • 列表

据我所知,我的代码:

<TreeView x:Name="ruleSetTree" Margin="0,10,0,0" ItemsSource="{Binding Path=SelectedTypeRuleSet>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate  DataType="{x:Type engine:RuleSet}">
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate x:Name="leafTemplate"
                              ItemsSource="{Binding Path=Rules}" 
                              DataType="{x:Type engine:RuleBase}">
                            <TextBlock Text="{Binding Path=Name}"/>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                    <TextBlock x:Name="hierarchyItem" Text="{Binding Path=TargetType}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
 </TreeView>

我现在看到的是 RuleSet 的名称。 TreeView 的切换按钮被隐藏。 我将一个 xml 反序列化到我的 RuleSet 模型中以获取此 TreeView 的数据。 RuleSet 填写正确...有人可以帮忙吗?

谢谢!

【问题讨论】:

    标签: wpf hierarchicaldatatemplate


    【解决方案1】:

    第一个HierarchicalDataTemplate 中没有指定ItemsSource。您不应该将其绑定到您的RuleSetList 属性吗?

    【讨论】:

      【解决方案2】:

      为什么要将另一个分层数据模板嵌套到现有模板中?那可能是错误。特别是因为您没有在第一个数据模板中指定 ItemSource。如果所有节点都是RuleSet 类型,你可以这样做:

      <TreeView x:Name="ruleSetTree" Margin="0,10,0,0" ItemsSource="{Binding Path=SelectedTypeRuleSet>
              <TreeView.ItemTemplate>
                  <HierarchicalDataTemplate DataType="{x:Type engine:RuleSet}"
                                            ItemsSource="{Binding Path=Rules}">
                      <StackPanel>
                          <TextBlock Text="{Binding Path=Name}"/>
                          <TextBlock Text="{Binding Path=TargetType}"/>
                      </StackPanel>
                  </HierarchicalDataTemplate>
              </TreeView.ItemTemplate>
      </TreeView>
      

      更新: 这是一个更新版本,应该符合您的要求。但是,如果所有子节点的类型都是 RuleBase

      <UserControl.Resources>
              <HierarchicalDataTemplate x:Key="RuleBaseTemplate"
                                        ItemsSource="{Binding Rules}">
                  <TextBlock Text="{Binding Name}"/>
              </HierarchicalDataTemplate>
      
              <HierarchicalDataTemplate x:Key="RuleSetTemplate" 
                                        ItemsSource="{Binding Rules}" 
                                        ItemTemplate="{StaticResource RuleBaseTemplate}">
                  <StackPanel>
                      <TextBlock Text="{Binding Name}"/>
                      <TextBlock Text="{Binding TargetType}"/>
                  </StackPanel>
              </HierarchicalDataTemplate>
      </UserControl.Resources>
      <!-- rest of the code -->
      <TreeView x:Name="ruleSetTree" Margin="0,10,0,0" 
                ItemsSource="{Binding SelectedTypeRuleSet}"
                ItemTemplate="{StaticResource RuleSetTemplate}"/>
      

      【讨论】:

      • 第一个节点是RuleSet,子节点是RuleBase
      • 所以,第一个相关项是:RuleSet 和 Rule(一对多关系)然后我们有:Rule - Rule(一对多关系)。我可以在 TreeView 中看到 RuleSet。层次结构是 TreeView 项目的模板,并且树视图已经分配了 ItemsSource...Htemplate 似乎共享它...
      • 一个问题:根元素Rule ARuleSet类型的唯一项吗?
      • 否(我的错误 - “糟糕的绘图” -> 它在发布时搞砸了)。层次结构是:1 RuleSet(但我把它作为一个包含一个项目的集合,以便能够将它作为数据源到第一层次)。所以 1 个具有 (1..n) 个规则的规则集,每个规则可以有 (1..n) 个其他规则,依此类推
      • 你能画一个更大的例子树吗?
      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 2011-08-27
      • 2011-10-10
      • 1970-01-01
      • 2011-04-20
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多