HierarchicalDataTemplate问题

时间:2012-05-09 11:41:48

标签: wpf hierarchicaldatatemplate

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

  • RuleSet< - (root) -RuleA
    • RuleB
      • RuleC
      • RuleA .....
    • 排除

RuleA,...派生自具有

的相同RuleBase
  • 类型
  • RuleBase []规则

RuleSet有

  • 名称
  • 列表

我的代码就我而言:

<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被正确填写......任何人都可以伸出援助之手吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

第一个ItemsSource中未指定HierarchicalDataTemplate。你不应该将它绑定到List的{​​{1}}属性吗?

答案 1 :(得分:0)

为什么要将另一个分层数据模板嵌入到现有分层数据模板中?这可能是错误的。特别是因为您没有在第一个数据模板中指定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}"/>