可以绑定一个对象列表吗
本文关键字:列表 一个对象 绑定 | 更新日期: 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>