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是在代码隐藏中为每个列生成的。非常感谢,如果您想深入了解嵌套模板,这篇文章可能会有所帮助。