我有以下数据结构
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级操作 但我不能重复它到下一级(即当一章包含子章节)我怎样才能在我的扩展器上表示它。 我所做的是章节 - 在扩展器中绑定页面。我的问题是如何添加章节。我是否可以简单地绑定它或者我是否需要手动创建控件 是代码建议的任何示例或修改
答案 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。
这样您的层次结构应该没有任何问题。