WPF中Xceed Datagrid跨列数据绑定合并显示的实现问题
解决方案
问题根源
原有代码绑定失效的核心原因:
- Xceed DataGrid 中
CellContentTemplate的默认数据上下文是当前列对应字段的值(此处为ProductName字段值),并非整行的数据源对象 - 使用
ElementName=ProductStatus绑定列对象无效,列属于UI容器定义,不会将自身值传入单元格模板的上下文
修正代码
方案1(最小改动适配原有逻辑)
通过RelativeSource查找当前行控件,取整行数据源的ProductStatus字段:
<xcdg:DataGridControl.Columns> <xcdg:Column x:Name="ProductID" FieldName="ProductID" ReadOnly="True" Visible="False" /> <xcdg:Column x:Name="ProductStatus" FieldName="ProductStatus" ReadOnly="True" Visible="False" /> <xcdg:Column x:Name="ProductIdentifier" FieldName="ProductIdentifier" ReadOnly="True" Visible="True" Title="Identifier" /> <xcdg:Column x:Name="ProductName" FieldName="ProductName" Width="*" ReadOnly="True" Visible="True" Title="Name"> <xcdg:Column.CellContentTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding DataContext.ProductStatus, RelativeSource={RelativeSource AncestorType={x:Type xcdg:DataRow}}}" Foreground="{StaticResource Blue1Brush}" /> <TextBlock Text=" - " /> <TextBlock Text="{Binding}" /> </StackPanel> </DataTemplate> </xcdg:Column.CellContentTemplate> </xcdg:Column> <xcdg:Column x:Name="VendorNumber" FieldName="VendorNumber" ReadOnly="True" Visible="True" Title="Vendor" /> </xcdg:DataGridControl.Columns>
方案2(更易维护)
直接将模板的上下文指定为整行数据源,后续扩展其他字段更方便:
<xcdg:Column x:Name="ProductName" FieldName="ProductName" Width="*" ReadOnly="True" Visible="True" Title="Name"> <xcdg:Column.CellContentTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type xcdg:DataRow}}}"> <TextBlock Text="{Binding ProductStatus}" Foreground="{StaticResource Blue1Brush}" /> <TextBlock Text=" - " /> <TextBlock Text="{Binding ProductName}" /> </StackPanel> </DataTemplate> </xcdg:Column.CellContentTemplate> </xcdg:Column>
注意事项
确保你绑定的业务实体类的ProductStatus和ProductName属性为公开属性,且包含有效get访问器,属性名无拼写错误即可。
内容的提问来源于stack exchange,提问作者Nse
相关产品推荐
相关产品推荐

