如何设置ItemsControl ItemsSource以查看对象集合以及其中一个父对象中的子对象集合

时间:2018-03-06 21:30:15

标签: wpf mvvm data-binding multibinding

基本上我拥有的是ItemsControl,我设置了ItemsSource =" {Binding = Invoice.Jobs"。在那个乔布斯系列中,我还有另外两个名为" Shipments"和"费用"。我设置它,以便ItemsControl.Resources填充DataTemplates,确定我将用于每个作业,发货或费用的CustomControl的类型。他们通过每个的DataType来确定这一点。所以ItemsControl应该一个接一个地抽出所有这些控件,看起来像发票中的行项目。一组订单项将是:    -工作    -装船    -Fee

然后,如果有更多的工作或其他工作,它可能看起来像    -工作    -装船    -装船    -费用    -工作    -Shipment

<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>

Jobs类基本上是这样的:

public class Invoice
{
    public IEnumerable<BatchInvoiceJobDto> Jobs {get; set;}
}

public class BatchInvoiceJobDto
{
    public IEnumerable<BatchInvoiceShipmentDto> Shipments {get; set;}
    public IEnumerable<BatchInvoiceFeeDto> Fees{get; set;}
}

1 个答案:

答案 0 :(得分:0)

为了遍历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.ItemsPanelStackPanel设置为ItemsControl,那么它应显示为作业后面的行 - &gt;发货 - &gt;在Invoice.Jobs中为每件商品订购费用。

注意:

您可能希望将属性类型从IEnumerable更改为ObservableCollection,以便更新并正确显示。