WPF DataGrid动态列下设置单元格前景色为绿色的问题
问题分析
- 绑定路径不可靠:你通过
Content.Text获取单元格值的方式存在问题——AutoGenerateColumns生成的单元格内容初始化时机不确定,且部分列的Content可能并非TextBlock,导致绑定获取的值为空。 - 类型匹配错误:转换器中用
char类型的'✔'和string类型的cellValue比较,存在类型不匹配问题,会导致判断逻辑失效。
解决方案
方案一:通过AutoGeneratingColumn事件动态设置列样式(推荐)
利用自动生成列的事件,为每个列单独绑定对应字段的值,避免依赖单元格Content:
1. 修改XAML,添加事件绑定
<DataGrid Grid.Column="1" Grid.Row="3" Margin="0,0,5,5" ItemsSource="{Binding DtSub, Mode=TwoWay}" Style="{DynamicResource ExcelStyle}" RowStyle="{DynamicResource ExcelRowStyle}" ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyleVertical}" AutoGenerateColumns="True" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"> </DataGrid>
2. 后台实现事件处理逻辑
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { if (e.Column is DataGridTextColumn textColumn) { // 创建针对当前列字段的数据触发器 DataTrigger checkMarkTrigger = new DataTrigger { Binding = new Binding(e.PropertyName), Value = "✔" }; // 设置样式变更规则 checkMarkTrigger.Setters.Add(new Setter(DataGridCell.ForegroundProperty, Brushes.Green)); checkMarkTrigger.Setters.Add(new Setter(DataGridCell.FontWeightProperty, FontWeights.Bold)); // 基于原有样式创建新的单元格样式 Style cellStyle = new Style(typeof(DataGridCell)) { BasedOn = (Style)FindResource("ExcelCellStyle") }; cellStyle.Triggers.Add(checkMarkTrigger); textColumn.CellStyle = cellStyle; } }
方案二:修复转换器与绑定逻辑
通过MultiBinding传递数据源和列名,直接从DataRowView中获取单元格值:
1. 修改转换器代码
public class CellValueToBoolenConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is DataRowView rowView && parameter is string columnName) { var cellValue = rowView[columnName]?.ToString(); return cellValue == "✔"; } return false; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
2. 修改XAML中的样式绑定
<Style TargetType="DataGridCell" BasedOn="{StaticResource ExcelCellStyle}" x:Key="ModifiedExcelCellStyle"> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource cellConverter}"> <!-- 传递当前行的数据源 --> <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/> <!-- 传递当前列的字段名 --> <Binding RelativeSource="{RelativeSource Self}" Path="Column.SortMemberPath"/> </MultiBinding> </DataTrigger.Binding> <Setter Property="Foreground" Value="Green"/> <Setter Property="FontWeight" Value="Bold"/> </DataTrigger> </Style.Triggers> </Style>
注意事项
- 确保Oracle数据库返回的
✔为字符串类型,若为char类型,需在转换器中调整值判断逻辑。 - 方案一适配自动生成列的场景,绑定逻辑更直接,避免了Content为空的问题,优先推荐使用。
内容的提问来源于stack exchange,提问作者Gokhan
相关产品推荐
相关产品推荐

