【问题标题】:wpf nested databinding for listboxes and listitems用于列表框和列表项的 wpf 嵌套数据绑定
【发布时间】:2011-10-12 20:33:50
【问题描述】:

我是 WPF 和数据绑定的新手。我需要将扩展​​器标题绑定到列表(名称)和扩展器内容到列表(服务)。在阅读了有关数据绑定的 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 >

如何将标题文本块绑定到人名并将内部列表框项绑定到他们的服务?

【问题讨论】:

    标签: wpf vb.net xaml data-binding


    【解决方案1】:

    由于您使用的是对象列表,因此您需要使用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 的所有服务。

    【讨论】:

    • 我无法引用我的 Application.vb 中的变量,我如何在此处调用它们,或者有没有办法通过仅在 XAML 中使用 {Binding} 以编程方式执行此操作?
    • 我不确定我理解你的意思。无论包含ItemsControl 的容器都应该将其DataContext 设置为您的人员列表。例如,您可以将 Me.MainWindow.DataContext = p1 放在 MainWindow 的加载事件中。设置 DataContext 后,您可以访问该 DataContext 的任何属性,因此如果您的 DataContext 是 Person 对象,您可以使用 {Binding Name}Person.Services 绑定到 Person.Name {Binding Services}
    • 嘿,谢谢!我只是想了解 DataContext 是什么。我做了你所说的并覆盖了 toString 方法并且它有效!一个后续问题,我把所有这些东西放在一个 中。这个网格可以有多个数据上下文吗?
    • 不,Grid 一次只能有一个 DataContext。不过,您可以为 Grid 的每个子控件设置不同的 DataContext,并且可以通过 RelativeSourceElementName 绑定引用 DataContext 之外的属性
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2016-05-23
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多