【问题标题】:Bind DataGrid Columns to Nested Objects将 DataGrid 列绑定到嵌套对象
【发布时间】:2019-04-01 22:53:38
【问题描述】:

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

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>

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

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

【问题讨论】:

标签: c# wpf datagrid


【解决方案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,了解如何执行此操作的示例。

【讨论】:

  • 是的,我试图避免创建 4 个不同的“模板”。不确定是否有任何其他方法可以解决这个问题。我会继续寻找。
  • 除了以编程方式创建模板之外别无他法。这样您就不必重复几乎相同的标记 4 次。
  • 我按照你的建议做了。 DataGridTemplateColumn 和 DataTemplate 在代码隐藏中为每一列生成。非常感谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2015-01-16
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多