我有以下结构
QPage
类对象包含List<List<QLine>>
QLine
对象包含List<Qword>
每个单词列表构造一行,每个行列表包含一个组(段落),每个段落列表都包含一个页面。
我想在XAML
中将页面绑定到这样的结构<ListView>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock>
</TextBlock>
</StackPanel>
</StackPanel>
</ListView>
其中ListView的每个项目都是一个段落(List<QLine>
),每个垂直堆栈面板都包含List<QLine>
的项目,水平堆栈面板的每个项目都包含{{1并且texblock绑定到List<Qword>
属性。我不知道如何从XAML代码中进行这样的绑定。
答案 0 :(得分:4)
希望我没有错过一些列表,但这应该有效。基本上它是ListBox
托管List<List<QLine>>
(称为QPageList
)。然后,您有ItemsControl
在垂直面板中托管每个List<QLine>
,最后还有另一个ItemsControl
来自List<Qword>
QLine
(称为QwordList
)每个QWord
在水平TextBlock
StackPanel
<!-- ItemsSource: List<List<QLine>>, Item: List<QLine> -->
<ListBox ItemsSource="{Binding QPageList}">
<ListBox.ItemTemplate>
<DataTemplate>
<!-- ItemsSource: List<QLine>, Item: QLine -->
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- ItemsSource: QLine.List<QWord>, Item: QWord -->
<ItemsControl ItemsSource="{Binding QwordList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- Item: QWord -->
<TextBlock Text="{Binding text}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 1 :(得分:1)
您要找的是ListView.ItemTemplate
。基本上,您需要为列表提供一种了解行的嵌套数据结构的方法。
这是一个很好的教程,可以帮助您开始使用ItemTemplates。
一旦你的列表中有一个项目模板,那么你只需将ListView直接绑定到你的数据源即可。
答案 2 :(得分:0)
Hopefuly这将证明是有帮助的。 Taken from here
Authors (list)
- - Name
- - Books (list)
| - - Title
| - - Contents
示例代码:
<Window.Resources>
<DataTemplate x:Key="ItemTemplate1">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="ItemTemplate2">
<StackPanel>
<TextBlock Text="{Binding Title}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource AuthorDataSource}}">
<ListBox x:Name="AuthorList" ItemTemplate="{DynamicResource ItemTemplate1}" ItemsSource="{Binding Authors }" >
<ListBox x:Name="BookList" DataContext="{Binding SelectedItem, ElementName=AuthorList}" ItemsSource="{Binding Books }" ItemTemplate="{DynamicResource ItemTemplate2}" />
<TextBlock x:Name="BookContent" DataContext="{Binding SelectedItem, ElementName=BookList}" Text="{Binding Contents }" />
</Grid>
答案 3 :(得分:0)
转发到亚历克斯所说的,Encapsulate
(如果这是正确的话)这个对象在类中是个好主意,即:
public class Page
{
public List<Paragraph> Paragraphs { get; set; }
}
public class Paragraph
{
public List<QWord> Sentences { get; set; }
}
public class Sentence
{
public List<QWord> Words { get; set; }
}
当您在XAML中绑定数据时,这会有所帮助,即如果您查看Alex提供的教程:
<TextBlock Text="Name: " />
<TextBlock Text="{Binding Name}" FontWeight="Bold" />
<TextBlock Text="{Binding Age}" FontWeight="Bold" />
<TextBlock Text=" (" />
<TextBlock Text="{Binding Mail}" TextDecorations="Underline" Foreground="Blue" Cursor="Hand" />
<TextBlock Text=")" />
希望对你有所帮助。