多级扩展器WPF

时间:2014-05-26 06:24:50

标签: c# wpf expander

我有以下数据结构

public class enrichment
{
    public string name { get; set; }
    public string type { get; set; }
}

public class Pages
{
    public string name { get; set; }
    public List<enrichment> enrichment { get; set; }
    public string label { get; set; }
}

public class SubChapter
{
    public string name { get; set; }
    public string id { get; set; }
    public List<Pages> pages { get; set; }
    public string parentId { get; set; }
}

public class Chapter
{
    public string name { get; set; }
    public string id { get; set; }
    public List<Pages> pages { get; set; }
    public List<SubChapter> chapters { get; set; }
}
public class TOCData
{
    public List<Chapter> chapters { get; set; }
}

样本数据看起来像这样

Chapter 1
  page 1
  page 2
  Chapter 1.1 
      page a
      page b          
Chapter 2 
   page 3
Chapter 3 
   chapter 3.1
      page c
      page d          

我想在扩展器控件中显示这些数据,并且我能够使用此处说明的结构{2}进行2级操作 但我不能重复它到下一级(即当一章包含子章节)我怎样才能在我的扩展器上表示它。 我所做的是章节 - 在扩展器中绑定页面。我的问题是如何添加章节。我是否可以简单地绑定它或者我是否需要手动创建控件 是代码建议的任何示例或修改

2 个答案:

答案 0 :(得分:1)

通常,您可以将TreeView与包含扩展器的自定义模板一起使用。应该花费1/2小时,或者如果您的结构非常严格,您可以创建2个控件(ChapterViewer和PageViewer,并从ItemsControl派生。他们的DataContext将是您的相应类。然后您可以为它们定义DataTemplates,这意味着章节将以可视方式表示通过一个ChapterViewer和一个PageViewer页面。这允许你按照你想要的方式构建你的结构。但它在结构上有点固定。我会使用模板化的TreeView。

EDIT ----&GT; 这是我创建的示例(http://1drv.ms/Tdq2Re)中的代码:

ViewModel.cs(基本数据结构):

public ViewModel()
        {
            this.TocData = new TOCData
            {
                Name = "Chapters",
                Chapters = new ObservableCollection<Chapter>
                {
                    new Chapter{ Name="Chapter 1", 
                        Elements = new ObservableCollection<ViewModelBase>
                        {
                            new Chapter
                            {
                                Name = "Introduction", 
                                Elements = new ObservableCollection<ViewModelBase>
                                {
                                    new Page(){Label = "Page I"},
                                    new Page(){Label = "Page II"},
                                    new Page(){Label = "Page III"}
                                }
                            },
                            new Page(){Label = "Page 1"},
                            new Page(){Label = "Page 2"},
                            new Page(){Label = "Page 3"},
                            new Page(){Label = "Page 4"},
                        }},            
                    new Chapter{ Name="Chapter 2", Elements = new ObservableCollection<ViewModelBase>
                        {              
                            new Page(){Label = "Page 5"},
                            new Page(){Label = "Page 6"},
                            new Page(){Label = "Page 7"},
                            new Page(){Label = "Page 8"},
                        }},
                }
            };
        }

它的使用方式如下:

<Grid>
   <local:ChapterControl ItemsSource="{Binding Path=TocData.Chapters}"  />
</Grid>

ChapterControl.xaml.cs(CustomControl):

 public class ChapterControl : ItemsControl
    {
        static ChapterControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ChapterControl), new FrameworkPropertyMetadata(typeof(ChapterControl)));
        }
    }

控件的样式等:

<!-- Chapter Template -->
    <DataTemplate x:Key="ChapterTemplate"  DataType="local:Chapter">
        <StackPanel>
            <local:ChapterControl  ItemsSource="{Binding Path=Elements}" />
        </StackPanel>
    </DataTemplate>

    <!-- Page Template -->
    <DataTemplate x:Key="pageTemplate"  DataType="local:Page">
        <TextBlock Text="{Binding Label}" Margin="25,0,0,0" />
    </DataTemplate>

    <local:ChapterItemStyleSelector x:Key="chapterItemStyleSelector" PageTemplate="{StaticResource pageTemplate}" ChapterTemplate="{StaticResource ChapterTemplate}" />

    <Style TargetType="{x:Type local:ChapterControl}">
        <Setter Property="ItemTemplateSelector" Value="{StaticResource chapterItemStyleSelector}" />
        <Setter Property="Margin" Value="10,0,0,0" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ChapterControl}">
                    <Expander Header="{Binding Name}">
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

答案 1 :(得分:0)

我的建议是摆脱SubChapter并将章节列表更改为List<Chapter>

然后为章节创建一个UserControl,其中包含一个Expander,一个用于页面的ListBox和一个用于章节的ListBox。

这样您的层次结构应该没有任何问题。