如何设置 ItemsControl ItemsSource 以查看对象集合以及其中一个父对象中的子对象集合
How do you set your ItemsControl ItemsSource to see a collection of objects and also the collection of child-objects within one of the parent-objects
基本上我有一个 ItemsControl 并且我设置了 ItemsSource="{Binding =Invoice.Jobs"。在那个 Jobs 集合中,我还有另外两个集合,分别称为 "Shipments" 和 "Fees"。我对其进行了设置,以便 ItemsControl.Resources 充满了数据模板,这些模板确定了我将用于每个工作、装运或费用的 CustomControl 类型。他们通过其中每一个的数据类型来确定这一点。所以 ItemsControl 应该一个接一个地抽出所有这些控件,看起来有点像发票中的行项目。一组订单项是:
-工作
-运输
-费用
然后如果有更多工作或其他工作,它可能看起来像
-工作
-运输
-运输
-费用
-工作
-发货
<ItemsControl ItemsSource="{Binding Invoice.Jobs}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceJobDto }">
<control:JobLineItem>
</control:JobLineItem>
</DataTemplate>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceShipmentDto}">
<control:ShipmentLineItem>
</control:ShipmentLineItem>
</DataTemplate>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceFeeDto }">
<control:FeeLineItem>
</control:FeeLineItem>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
乔布斯class基本上是这样的:
public class Invoice
{
public IEnumerable<BatchInvoiceJobDto> Jobs {get; set;}
}
public class BatchInvoiceJobDto
{
public IEnumerable<BatchInvoiceShipmentDto> Shipments {get; set;}
public IEnumerable<BatchInvoiceFeeDto> Fees{get; set;}
}
为了遍历 Invoice.Jobs 集合中的集合,我建议嵌套 ItemsControl
控件。
XAML:
<ItemsControl ItemsSource="{Binding Invoice.Jobs}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<ItemsControl ItemsSource="{Binding Shipments}">
<ItemsControl.ItemTemplate>
<DataTemplate>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Fees}">
<ItemsControl.ItemTemplate>
<DataTemplate>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果您要将每个 ItemsControl
的 ItemsControl.ItemsPanel
设置为 StackPanel
,那么它应该显示为在作业 -> 发货 -> 费用订单之后的行Invoice.Jobs.
注:
您可能需要将 属性 类型从 IEnumerable
更改为 ObservableCollection
,以便它们能够正确更新和显示。
基本上我有一个 ItemsControl 并且我设置了 ItemsSource="{Binding =Invoice.Jobs"。在那个 Jobs 集合中,我还有另外两个集合,分别称为 "Shipments" 和 "Fees"。我对其进行了设置,以便 ItemsControl.Resources 充满了数据模板,这些模板确定了我将用于每个工作、装运或费用的 CustomControl 类型。他们通过其中每一个的数据类型来确定这一点。所以 ItemsControl 应该一个接一个地抽出所有这些控件,看起来有点像发票中的行项目。一组订单项是: -工作 -运输 -费用
然后如果有更多工作或其他工作,它可能看起来像 -工作 -运输 -运输 -费用 -工作 -发货
<ItemsControl ItemsSource="{Binding Invoice.Jobs}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceJobDto }">
<control:JobLineItem>
</control:JobLineItem>
</DataTemplate>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceShipmentDto}">
<control:ShipmentLineItem>
</control:ShipmentLineItem>
</DataTemplate>
<DataTemplate DataType="{x:Type preInvoice:BatchInvoiceFeeDto }">
<control:FeeLineItem>
</control:FeeLineItem>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
乔布斯class基本上是这样的:
public class Invoice
{
public IEnumerable<BatchInvoiceJobDto> Jobs {get; set;}
}
public class BatchInvoiceJobDto
{
public IEnumerable<BatchInvoiceShipmentDto> Shipments {get; set;}
public IEnumerable<BatchInvoiceFeeDto> Fees{get; set;}
}
为了遍历 Invoice.Jobs 集合中的集合,我建议嵌套 ItemsControl
控件。
XAML:
<ItemsControl ItemsSource="{Binding Invoice.Jobs}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<ItemsControl ItemsSource="{Binding Shipments}">
<ItemsControl.ItemTemplate>
<DataTemplate>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Fees}">
<ItemsControl.ItemTemplate>
<DataTemplate>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果您要将每个 ItemsControl
的 ItemsControl.ItemsPanel
设置为 StackPanel
,那么它应该显示为在作业 -> 发货 -> 费用订单之后的行Invoice.Jobs.
注:
您可能需要将 属性 类型从 IEnumerable
更改为 ObservableCollection
,以便它们能够正确更新和显示。