如何将列表列表绑定到ListView控件

时间:2014-02-03 11:10:21

标签: c# xaml windows-8 binding

我有以下结构

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代码中进行这样的绑定。

4 个答案:

答案 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=")" />

希望对你有所帮助。