将DataGrid列绑定到嵌套对象

时间:2018-10-29 03:02:39

标签: c# wpf datagrid

我有一个具有属性的主对象,每个对象都有自己的对象:

Package {
    Name
    Date
}

Document {
   Name
   Package1 = Package()
   Package2 = Package()
   Package3 = Package()
   Package4 = Package()
}

现在在WPF数据网格中,我想将每一列绑定到Document.PackageX属性之一。但是,DataTemplate内部的Name绑定总是选择Document.Name而不是Package.Name

<DataTemplate x:Key="MyCellTemplate">
    <Border>
        <TextBlock Text="{Binding Name}" />     # this is Package.Name property
    </Border>
</DataTemplate>

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Package 1" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 2" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 3" CellTemplate="{StaticResource MyCellTemplate}"/>
        <DataGridTemplateColumn Header="Package 4" CellTemplate="{StaticResource MyCellTemplate}"/>
    </DataGrid.Columns>
</DataGrid>

如何将单元格模板的上下文设置为嵌套对象?

(为过分简化而道歉,但我认为这样更容易阅读和解释核心问题)

2 个答案:

答案 0 :(得分:1)

我认为他所提到的OP具有固定的数据结构

Document {
   Name
   Package1 = Package()
   Package2 = Package()
   Package3 = Package()
   Package4 = Package()
}

在将PackageX.Name出价到TextBlock时,需要将ListOfDocuments属性绑定到DataGrid

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Package 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Border>
                        <TextBlock Text="{Binding Package1.Name}" />     # this is Package.Name property
                    </Border>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Package 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Border>
                        <TextBlock Text="{Binding Package2.Name}" />     # this is Package.Name property
                    </Border>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        .....

    </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:1)

您需要定义4个不同的CellTemplates,分别绑定到Package1Package2Package3Package4

<DataGrid ItemsSource="{Binding ListOfDocuments}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Package 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package1.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package2.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 3">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package3.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Package 4">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Package4.Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

不能对所有4列使用相同的CellTemplate。如果CellTemplate比此处显示的要复杂,您可能需要考虑以编程方式创建模板。有关如何执行此操作的示例,请参考我的答案here