可以绑定一个对象列表吗

本文关键字:列表 一个对象 绑定 | 更新日期: 2023-09-27 18:00:24

我有以下类:

public class MyClass
{
    public MyClass()
    {
        OtherClass = new List<OtherClass>();
    }
    public List<OtherClass> OtherClass { get; set; }
}

OtherClass包含:

public class OtherClass 
{
    public OtherClass ()
    {
    }
    public string Name { get; set; }
}

和以下xaml MyView:

<DataTemplate DataType="{x:Type Framework:MyClass}">
   <StackPanel>
      <Label FontSize="20" Content="{Binding Path=OtherClass.Name}" />
   </StackPanel>
</DataTemplate>

在引用MyView:的MyWindow

<TabItem Header="My Class">
   <Views:MyView DataContext="{Binding Path=MyClass}" />
</TabItem>

我看到了绑定嵌套属性的其他例子,这些例子表明Binding Path(即OtherClass.Name)对于单个对象来说很好。但是,我绑定的是对象列表,而不是单个对象(在我的示例中,是OtherClass列表)。

是否可以绑定对象列表?

可以绑定一个对象列表吗

如果要为MyClass创建DataTemplate,则需要使用某种形式的ItemsControl来显示OtherClass列表属性

<DataTemplate DataType="{x:Type Framework:MyClass}">
    <ItemsControl ItemsSource="{Binding OtherClass}" DisplayMemberPath="Name"/>
</DataTemplate>

此外,OtherClass.Name必须是公共财产,而不是目前的私有财产

public class OtherClass 
{
    public OtherClass ()
    {
    }
    public string Name { get; set; }
}

编辑

DisplayMemberPath是显示单个属性的最简单方法,但如果您想显示OtherClass类中的多个属性,或更改其格式,则需要定义ItemsControl.ItemTemplate,并告诉ItemsControl如何显示每个项目

<ItemsControl ItemsSource="{Binding OtherClass}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name}"/>
                <!-- more properties that you want to display -->
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

您可能想在这里做的是创建一个ItemsControl,其中OtherClass列表中的每个项目都将由一个项目预呈现。您的ItemTemplate将指定该列表中的每个项目要显示的内容,在您的情况下,ItemTemplate将包含一个绑定到Name属性的Label。见下文:

<ItemsControl ItemsSource="{Binding OtherClass}" DataType="{x:Type Framework:MyClass}"> 
    <!-- ItemTemplate -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding Name}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

(请参阅此处更完整的示例)

如果绑定到对象的"列表",则该列表必须绑定到具有ItemsSource属性的控件。这些类型的控件能够绑定到集合,因此控件的内部DataContext就是列表的类型。在您的情况下,如果绑定到OtherClass属性(列表),则DataContext作用域的类型将为"OtherClass",然后您可以显式绑定到其属性。

正如其他人所提到的,您可以绑定到ItemsControl,但也可以绑定到ListBox、ListView、DataGrid、TreeView等。

<!-- Using ItemsControl -->
    <ItemsControl ItemsSource="{Binding OtherClass}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel />
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <DataTemplate.Resources>
            <Style TargetType="TextBlock">
              <Setter Property="FontSize" Value="20"/>
              <Setter Property="HorizontalAlignment" Value="Center"/>
            </Style>
          </DataTemplate.Resources>
          <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
<!-- Using ListBox-->
    <ListBox ItemsSource="{Binding OtherClass}">
        <ListBox.ItemTemplate>
          <DataTemplate>
            <DataTemplate.Resources>
              <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="20"/>
                <Setter Property="HorizontalAlignment" Value="Center"/>
              </Style>
            </DataTemplate.Resources>
            <TextBlock Text="{Binding Name}"/>
          </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>