wpf用于列表框和列表项的嵌套数据绑定

时间:2011-07-25 19:05:48

标签: wpf vb.net xaml data-binding

我是WPF和数据绑定的新手。我需要将扩展​​器头绑定到List(Of Names)和扩展器内容到List(Of Services)。阅读关于数据绑定的MS教程(如何以及在何处使用staticResource,Path等)后,我更加困惑。

我有一个

-------------
class Person 

name as string 
List servies as List (Of Services)

end class
--------------
class Service

name as string 
end class
----------------

在我的主类Application.vb中,我有一个Person对象列表

p1 as List(of Person)

我将所有这些初始化为虚拟值。 在Application.xaml中,我有

<Expander Name="listBox4" VerticalAlignment="Top" 
 HorizontalAlignment="Left" Header="   {Binding}" Content="{Binding}" >

  <Expander.HeaderTemplate >

      <DataTemplate>
         <TextBlock Text="{Binding}"/>
      </DataTemplate>

   </Expander.HeaderTemplate> 

   <Expander.ContentTemplate>

      <DataTemplate >
        <ListBoxItem Content="{Binding}"/> 
      </DataTemplate>

    </Expander.ContentTemplate>                 

</Expander >

如何将标题文本块与人名和内部列表框项绑定到其服务?

1 个答案:

答案 0 :(得分:3)

由于您正在使用对象列表,因此需要使用ItemsControl。扩展器只能处理一个DataContext,而ItemsControls只能处理列表或集合

您的代码应如下所示:

<ItemsControl ItemsSource="{Binding PersonList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Expander Header="{Binding Name}">
                <ListBox ItemsSource="{Binding Services}" />
            </Expander>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这会创建一个循环,表示遍历PersonList,并为每个Person生成一个Expander,其Header等于Person的名称,Expanded Content等于ListBox,它显示所有Person的服务。