我有一个具有属性的主对象,每个对象都有自己的对象:
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>
如何将单元格模板的上下文设置为嵌套对象?
(为过分简化而道歉,但我认为这样更容易阅读和解释核心问题)
答案 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
,分别绑定到Package1
,Package2
,Package3
和Package4
:
<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。