ListBox和listitems的wpf嵌套数据绑定

ListBox和listitems的wpf嵌套数据绑定,wpf,vb.net,xaml,data-binding,Wpf,Vb.net,Xaml,Data Binding,我是WPF和数据绑定的新手。我需要将expander头绑定到一个列表(名称),将expander内容绑定到一个列表(服务)。在阅读了有关数据绑定的MS教程(如何以及在何处使用staticResource、Path等)后,我更加困惑 我有一个 ------------- class Person name as string List servies as List (Of Services) end class -------------- class Service name as

我是WPF和数据绑定的新手。我需要将expander头绑定到一个列表(名称),将expander内容绑定到一个列表(服务)。在阅读了有关数据绑定的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 >


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

由于您使用的是对象列表,因此需要使用
ItemsControl
。Expander只能处理一个DataContext,而ItemsControl用于处理列表或集合

您的代码应该如下所示:

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


这将创建一个循环,表示遍历PersonList,并为每个人生成一个扩展程序,其标题等于该人的姓名,扩展内容等于显示该人所有服务的列表框。

我无法引用Application.vb中的变量,我如何在此处调用它们,或者有没有一种方法可以通过在XAML中只使用{Binding}以编程的方式实现这一点?我不确定我是否理解您的意思。任何包含
ItemsControl
的容器都应该将其
DataContext
设置为您的人员列表。例如,您可以将
Me.MainWindow.DataContext=p1
放入主窗口的已加载事件中。一旦设置了DataContext,您就可以访问该DataContext的任何属性,因此如果您的DataContext是Person对象,那么您可以使用
{Binding Name}
Person.Services
通过
{Binding Services}
绑定到
Person.Name
嘿,谢谢!我只是想知道什么是DataContext。我照你说的做了,推翻了toString方法,它成功了!一个跟进,一个问题,我把所有这些东西放在一个盒子里。这个网格可以有多个数据上下文吗?不,一个网格一次只能有一个数据上下文。但是,您可以为网格的每个子控件设置不同的DataContext,并且可以通过
RelativeSource
ElementName
绑定引用DataContext之外的属性