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

WinUI3 Community Toolkit DataGrid的C#简易输入验证方案咨询

针对WinUI3 DataGrid简单输入校验的可行方案

方案1:利用CellEditEnding事件+列标签(你提出的思路)

这个方案完全可行,实现步骤如下:

  1. 给DataGrid列设置Tag属性:
    在XAML定义列时,给对应列添加Tag标记数据类型,比如数字列设为"int",日期列设为"date":

    <controls:DataGridTextColumn Header="年龄" Binding="{Binding Age}" Tag="int" />
    <controls:DataGridTextColumn Header="入职日期" Binding="{Binding HireDate}" Tag="date" />
    
  2. 处理CellEditEnding事件:
    在后台代码中订阅CellEditEnding事件,在事件里获取当前编辑列的标签和输入值,完成校验:

    private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        if (e.EditAction != DataGridEditAction.Commit) return;
    
        // 获取当前列的类型标记
        var columnTypeTag = e.Column.Tag?.ToString();
        if (string.IsNullOrEmpty(columnTypeTag)) return;
    
        // 获取编辑控件的输入内容
        var textBox = e.EditingElement as TextBox;
        var inputValue = textBox?.Text?.Trim();
        if (string.IsNullOrEmpty(inputValue)) return;
    
        bool isValid = true;
        switch (columnTypeTag)
        {
            case "int":
                isValid = int.TryParse(inputValue, out _);
                break;
            case "date":
                isValid = DateTime.TryParse(inputValue, out _);
                break;
        }
    
        // 校验不通过时取消提交并提示
        if (!isValid)
        {
            e.Cancel = true;
            var tipContent = columnTypeTag switch
            {
                "int" => "请输入有效的整数",
                "date" => "请输入有效的日期格式",
                _ => "输入格式错误"
            };
            _ = new ContentDialog
            {
                Title = "输入错误",
                Content = tipContent,
                CloseButtonText = "确定"
            }.ShowAsync();
        }
    }
    

方案2:直接使用匹配类型的编辑控件(更简便)

如果只是基础类型校验,直接给列指定对应类型的编辑控件,从源头限制输入,比事后校验更友好:

  • 数字列:用NumericUpDown作为编辑控件,只能输入数字

    <controls:DataGridTemplateColumn Header="年龄">
        <controls:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Age}" />
            </DataTemplate>
        </controls:DataGridTemplateColumn.CellTemplate>
        <controls:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <NumericUpDown Value="{Binding Age, Mode=TwoWay}" Minimum="0" Maximum="100" />
            </DataTemplate>
        </controls:DataGridTemplateColumn.CellEditingTemplate>
    </controls:DataGridTemplateColumn>
    
  • 日期列:用DatePicker或CalendarDatePicker,只能选择合法日期

    <controls:DataGridTemplateColumn Header="入职日期">
        <controls:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding HireDate, StringFormat='yyyy-MM-dd'}" />
            </DataTemplate>
        </controls:DataGridTemplateColumn.CellTemplate>
        <controls:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <DatePicker Date="{Binding HireDate, Mode=TwoWay}" />
            </DataTemplate>
        </controls:DataGridTemplateColumn.CellEditingTemplate>
    </controls:DataGridTemplateColumn>
    

是否必须用INotifyDataErrorInfo?

完全没必要。INotifyDataErrorInfo适合复杂的业务校验场景(比如字段间关联校验、异步校验),需要在模型层做全局验证时才用。对于你的简单类型校验需求,上面两种方案足够轻量且高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:00:14