You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid自动生成列单元格验证及非法值样式设置方法

实现方案

1. 修改DataGrid XAML配置

移除原有行验证规则,添加列自动生成事件,同时修改单元格样式增加验证错误触发器,不会覆盖你原有的tableCellTheme样式:

<DataGrid Grid.Row="2"
          Margin="5"
          Background="Transparent"
          MaxHeight="300"
          MaxWidth="500"
          ScrollViewer.CanContentScroll="True"
          HorizontalAlignment="Center"
          VerticalAlignment="Center"
          ItemsSource="{Binding DataTable}"
          HeadersVisibility="None"
          CanUserAddRows="False"
          AutoGeneratingColumn="DataGrid_AutoGeneratingColumn">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell" BasedOn="{StaticResource tableCellTheme}">
            <Style.Triggers>
                <!-- 验证失败时自动设置单元格背景为红色,可根据需要修改为文字红色、边框红色等 -->
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="Background" Value="Red"/>
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

2. 编写单元格验证规则

自定义继承自ValidationRule的单元格校验逻辑,可根据不同列、不同数据类型定制校验规则:

using System.Globalization;
using System.Windows.Controls;

public class DataGridCellValidationRule : ValidationRule
{
    // 当前校验的列名,可用于区分不同列做不同校验
    public string ColumnName { get; set; }

    public DataGridCellValidationRule(string columnName)
    {
        ColumnName = columnName;
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        // 示例1:通用非空校验
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
        {
            return new ValidationResult(false, "值不能为空");
        }

        // 示例2:指定列的特殊校验,比如Age列必须是正整数
        // if (ColumnName == "Age" && (!int.TryParse(value.ToString(), out int age) || age < 0))
        // {
        //     return new ValidationResult(false, "年龄必须为正整数");
        // }

        return ValidationResult.ValidResult;
    }
}

3. 实现自动生成列事件逻辑

给所有自动生成的列绑定添加验证规则,开启验证通知:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.Column is DataGridBoundColumn boundColumn && boundColumn.Binding is Binding binding)
    {
        // 开启验证错误通知
        binding.NotifyOnValidationError = true;
        binding.ValidatesOnExceptions = true;
        // 为当前列绑定添加自定义验证规则
        binding.ValidationRules.Add(new DataGridCellValidationRule(e.PropertyName));
    }
}

可选优化:复用DataTable内置约束

如果你绑定的DataTable本身已经定义了列约束(比如非空、长度限制、数据类型限制),不需要额外编写自定义ValidationRule,只需要在上述事件代码中给Binding添加binding.ValidatesOnDataErrors = true;即可,DataGrid会自动捕获DataTable的列级错误触发红色样式。

内容的提问来源于stack exchange,提问作者Sim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:54:04