C# 将DataGrid列绑定到嵌套对象

C# 将DataGrid列绑定到嵌套对象,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个具有属性的主对象,每个属性都有自己的对象: Package { Name Date } Document { Name Package1 = Package() Package2 = Package() Package3 = Package() Package4 = Package() } 现在在WPF datagrid中,我想将每一列绑定到Document.PackageX属性之一。但是DataTemplate中的名称绑定总是选择Doc

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

Package {
    Name
    Date
}

Document {
   Name
   Package1 = Package()
   Package2 = Package()
   Package3 = Package()
   Package4 = Package()
}
现在在WPF datagrid中,我想将每一列绑定到Document.PackageX属性之一。但是DataTemplate中的名称绑定总是选择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>

#这是Package.Name属性
如何将单元格模板的上下文设置为嵌套对象


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

我假设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>

#这是Package.Name属性
#这是Package.Name属性
.....

您需要分别定义绑定到
Package1
Package2
Package3
Package4
的4种不同的
单元模板:

<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
。如果 CytoStase比这里所展示的更复杂,您可能需要考虑以编程方式创建模板。请参考我的答案,以了解如何做到这一点。

是的,我试图避免创建4个不同的“模板”。我不确定是否还有其他办法。我会继续寻找。除了通过编程创建模板之外,没有其他方法。那么你就不必重复几乎相同的标记4次了。我按照你的建议做了。DataGridTemplateColumn和DataTemplate是在代码隐藏中为每个列生成的。非常感谢,如果您想深入了解嵌套模板,这篇文章可能会有所帮助。