WPF Expander 2级的分层数据模板

时间:2014-09-17 07:24:28

标签: wpf xaml expander hierarchicaldatatemplate

我有像这样的重复数据结构

public class Chapter
{   
    public string id { get; set; }      
    public string name { get; set; }            
    public List<BPage> pages { get; set; }                      
    public List<SubChapter> chapters { get; set; }
}
public class SubChapter
{
    public string name { get; set; }
    public string id { get; set; }
    public List<BPage> pages { get; set; }
    public string ParentPageId { get; set; }
    public List<SubChapter> chapters { get; set; }
}
public class BPage
{
    public string name { get; set; }     
    public string label { get; set; }
}

这是我正在使用的xaml,但是这个xaml只给我一个级别的数据。第二级完全缺失

即如果第1章包含2个子章节和页面,则缺少这些信息     第1章        第1页        第2页        第1.1章            第1a页            第1b页
       第1.2章             第2a页             第2b页

xaml是

<ListBox ItemsSource="{Binding}"  Name="TOCView"  ItemContainerStyle="{StaticResource ListBoxItemStyle}">
    <ListBox.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding chapters}">
            <Expander>
                <Expander.Header>
                    <BulletDecorator>
                        <Label Style="{StaticResource ResourceKey=ChapterHeadStyle}"  Content="{Binding name}"></Label>
                    </BulletDecorator>
                </Expander.Header>
                <ItemsControl Margin="25,0,0,0" ItemsSource="{Binding pages}" >
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Button Tag="{Binding}"  Click="btnNavigateToPage_Click"  Style="{StaticResource ResourceKey=BookPageStyle}"  Content="{Binding Path=label}" >
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Expander>
        </HierarchicalDataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

1 个答案:

答案 0 :(得分:0)

您的问题是由于您只提供了一个HierarchicalDataTemplate而引起的,但您想要定义两个层级。因此,您需要为您的第二级提供另一个HierarchicalDataTemplate。请注意,您必须在ListBox.ItemTemplate属性中定义它们,而是在Resources部分中定义它们:

<HierarchicalDataTemplate DataType="{x:Type YourPrefix:Chapter}"
    ItemsSource="{Binding CollectionPropertyInSubChapterClass}">
    ...
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type YourPrefix:SubChapter}">
    ItemsSource="{Binding CollectionPropertyInBPageClass}">
    ...
</HierarchicalDataTemplate>

只要您为其中任何一个指定x:Key指令,它们就会被隐式应用,因此您不必提供任何值对于ListBox.ItemTemplate属性。