如何根据DataTable错误设置WPF DataGrid单元格背景与提示
实现DataGrid单元格错误提示与背景色变化
步骤1:创建列错误转换器
首先编写一个转换器类,用于判断指定DataRowView的目标列是否存在错误,同时返回错误信息或布尔判断结果:
Imports System.Windows.Data Public Class DataColumnErrorConverter Implements IMultiValueConverter Public Function Convert(values() As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IMultiValueConverter.Convert Dim rowView As DataRowView = TryCast(values(0), DataRowView) Dim columnName As String = TryCast(values(1), String) If rowView IsNot Nothing AndAlso Not String.IsNullOrEmpty(columnName) Then Dim errorMsg As String = rowView.Row.GetColumnError(columnName) ' 根据目标类型返回对应结果:布尔值用于判断是否有错误,字符串用于ToolTip显示 Return If(targetType = GetType(Boolean), Not String.IsNullOrEmpty(errorMsg), errorMsg) End If Return If(targetType = GetType(Boolean), False, Nothing) End Function Public Function ConvertBack(value As Object, targetTypes() As Type, parameter As Object, culture As Globalization.CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack Throw New NotImplementedException() End Function End Class
步骤2:在XAML中配置单元格样式
在窗口或用户控件的资源区声明转换器,并定义DataGrid单元格的样式,实现背景色切换和ToolTip绑定逻辑:
<Window.Resources> <!-- 注册转换器 --> <local:DataColumnErrorConverter x:Key="ColumnErrorConverter"/> <!-- 定义带错误提示的单元格样式 --> <Style x:Key="ErrorCellStyle" TargetType="DataGridCell"> <!-- 默认背景色为白色 --> <Setter Property="Background" Value="White"/> <!-- 绑定ToolTip到当前单元格的列错误信息 --> <Setter Property="ToolTip"> <Setter.Value> <MultiBinding Converter="{StaticResource ColumnErrorConverter}"> <!-- 绑定当前行的DataRowView对象 --> <Binding/> <!-- 绑定当前单元格所属列的Header(需与DataTable列名一致) --> <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/> </MultiBinding> </Setter.Value> </Setter> <!-- 触发规则:存在列错误时切换背景为红色 --> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition> <Condition.Binding> <MultiBinding Converter="{StaticResource ColumnErrorConverter}"> <Binding/> <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/> </MultiBinding> </Condition.Binding> <Condition.Value>True</Condition.Value> </Condition> </MultiDataTrigger.Conditions> <Setter Property="Background" Value="Red"/> </MultiDataTrigger> </Style.Triggers> </Style> </Window.Resources>
步骤3:为DataGrid应用单元格样式
修改你的DataGrid XAML代码,添加CellStyle属性引用上述定义的样式:
<DataGrid x:Name="myDataGrid" HorizontalAlignment="Left" Height="304" Margin="0,122,0,0" VerticalAlignment="Top" Width="790" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" SelectionUnit="CellOrRowHeader" Style="{DynamicResource DataGridStyle1}" CanUserSortColumns="False" CellStyle="{StaticResource ErrorCellStyle}"> </DataGrid>
注意事项
- 确保DataGrid列的
Header值与DataTable的列名完全匹配,否则转换器无法正确定位列错误信息。如果列Header与列名不同,可将绑定路径改为Column.SortMemberPath或Column.DisplayBinding.Path.Path,以获取正确的DataTable列名。 - 调用
SetColumnError方法设置错误信息后,DataRowView会自动触发属性变更通知,UI会实时更新单元格的背景色和ToolTip,无需手动刷新DataGrid。
内容的提问来源于stack exchange,提问作者awi2b
相关产品推荐
相关产品推荐

