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

基于MVVM RelayCommand的Syncfusion DataForm日期验证求助

解决方案

方法一:在Save命令中手动验证并同步DataForm反馈

直接在SaveAsync命令内完成验证逻辑,同时利用SfDataForm的API同步UI错误提示:

修改ViewModel的SaveAsync方法

[RelayCommand]
private async Task SaveAsync()
{
    bool isValid = true;
    var currentDate = DateTime.Today; // 若需包含时间精度,替换为DateTime.Now
    var targetFieldName = "ScheduleDate"; // 替换为你需要验证的日期字段名

    // 单独验证目标日期字段
    if (Order.ScheduleDate < currentDate)
    {
        isValid = false;
        dataForm.SetError(targetFieldName, "日期必须大于等于当前日期");
    }
    else
    {
        dataForm.ClearError(targetFieldName);
    }

    // 触发DataForm整体验证,确保其他字段也符合要求
    bool formIsValid = dataForm.Validate();
    isValid &= formIsValid;

    if (isValid && Order != null)
    {
        dataAccess.Insert(Order);
        await DialogService.DisplayAlertAsync("添加订单", "订单已添加", "确定");
        await NavigationService.PopModalAsync();
    }
    else
    {
        await DialogService.DisplayAlertAsync("验证失败", "请检查输入的日期是否符合要求", "确定");
    }
}

传递DataForm实例到ViewModel

在页面构造函数中把SfDataForm实例传给ViewModel:

// NewOrderPage构造函数修改
public NewOrderPage(NewOrderViewModel viewModel)
{
    InitializeComponent();
    viewModel.DataForm = dataForm; // 给ViewModel添加SfDataForm类型的公开属性DataForm
    BindingContext = viewModel;
    this.dataForm.GenerateDataFormItem += OnGenerateDataFormItem;
}

方法二:自定义DataForm验证规则(推荐)

实现Syncfusion的IDataFormValidator接口,将验证逻辑与UI绑定,自动处理错误提示:

1. 创建自定义验证器类

public class OrderDataFormValidator : IDataFormValidator
{
    public ValidationResult Validate(object dataObject, string columnName)
    {
        var order = dataObject as Order;
        if (order == null) return new ValidationResult(true, string.Empty);

        switch (columnName)
        {
            case "ScheduleDate": // 替换为目标日期字段名
                if (order.ScheduleDate < DateTime.Today)
                {
                    return new ValidationResult(false, "日期必须大于等于当前日期");
                }
                break;
            // 可添加其他字段的验证逻辑
        }
        return new ValidationResult(true, string.Empty);
    }
}

2. 给DataForm绑定验证器

在页面构造函数中设置验证器:

this.dataForm.Validator = new OrderDataFormValidator();

3. 简化SaveAsync命令

只需检查DataForm整体验证结果:

[RelayCommand]
private async Task SaveAsync()
{
    if (dataForm.Validate() && Order != null)
    {
        dataAccess.Insert(Order);
        await DialogService.DisplayAlertAsync("添加订单", "订单已添加", "确定");
        await NavigationService.PopModalAsync();
    }
    else
    {
        await DialogService.DisplayAlertAsync("验证失败", "请检查所有输入字段", "确定");
    }
}

方法三:自定义模型验证属性

通过自定义验证属性在模型层面实现动态日期验证:

1. 创建自定义验证属性

public class MinCurrentDateAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value is DateTime date)
        {
            return date >= DateTime.Today; // 按需替换为DateTime.Now
        }
        return false;
    }

    public override string FormatErrorMessage(string name)
    {
        return $"{name}必须大于等于当前日期";
    }
}

2. 在Order模型中应用属性

public class Order
{
    // 其他属性...
    [MinCurrentDate]
    public DateTime ScheduleDate { get; set; }
    // 其他属性...
}

3. 启用DataForm模型验证

在XAML中配置DataForm的验证模式:

<dataForm:SfDataForm
    x:Name="dataForm"
    Grid.Row="1"
    Grid.Column="1"
    DataObject="{Binding Order}"
    HorizontalOptions="FillAndExpand"
    LayoutType="TextInputLayout"
    ValidationMode="PropertyChanged"> <!-- 可选LostFocus,根据交互需求选择 -->
    <dataForm:SfDataForm.Behaviors>
        <local:DataFormBehavior />
    </dataForm:SfDataForm.Behaviors>
</dataForm:SfDataForm>

4. 修改SaveAsync命令

同样通过DataForm的验证结果判断是否执行保存:

[RelayCommand]
private async Task SaveAsync()
{
    if (dataForm.Validate() && Order != null)
    {
        dataAccess.Insert(Order);
        await DialogService.DisplayAlertAsync("添加订单", "订单已添加", "确定");
        await NavigationService.PopModalAsync();
    }
    else
    {
        await DialogService.DisplayAlertAsync("验证失败", "请检查所有输入字段", "确定");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:45:38