如何设置 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>

如果您要将每个 ItemsControlItemsControl.ItemsPanel 设置为 StackPanel,那么它应该显示为在作业 -> 发货 -> 费用订单之后的行Invoice.Jobs.

注:

您可能需要将 属性 类型从 IEnumerable 更改为 ObservableCollection,以便它们能够正确更新和显示。