在用户将数据输入字段之前如何防止验证?

Posted

技术标签:

【中文标题】在用户将数据输入字段之前如何防止验证?【英文标题】:How to prevent validation until the user enters data into a field? 【发布时间】:2014-05-09 12:05:55 【问题描述】:

我有带有常规控件的 WPF 表单:组合框、TextEdit 等。

我正在使用标准 WPF 验证:

    ViewModel 强制属性具有带消息的必需属性 ViewModel 实现 IDataErrorInfo 强制控制在绑定中具有 ValidatesOnDataErrors=True、NotifyOnValidationError=True

当表单与新的 ViewModel 一起显示时,强制控件使用错误模板进行装饰。 在我看来,这似乎是 WPF 验证的假设和设计方式。

我团队中的其他人(恭敬地)争辩说,在用户输入任何数据之前显示用户验证错误是不可接受的做法。

这对我来说很有意义。因此,如果我只想在用户输入数据后显示验证错误,我需要以某种方式暂停验证,直到用户输入数据然后触发验证。 对我来说,这似乎是在重新发明一个***。

【问题讨论】:

【参考方案1】:

有一种真的简单的方法可以“忽略”IDataErrorInfo 接口的验证。现在不同的开发人员将以不同的方式实现他们的验证,但在某个阶段和某个位置,我们都会有一些if ... else 语句。此解决方案将要求您将 bool 属性添加到您的数据类型类,或者最好为您的数据类型添加一个基类,如果您有的话:

public bool IsValidatable  get; set;  // Implement INotifyPropertyChanged here

当然,您需要将此属性更改通知INotifyPropertyChanged.PropertyChanged 事件,因此请不要按照我上面的懒惰示例进行操作。现在,您可能已经猜到了解决方案的其余部分......它只涉及一个额外的 if 语句,无论您在哪里定义了验证条件:

public override string this[string propertyName]

    get
    
        string error = string.Empty;
        if (IsValidatable)
         
            if (propertyName == "Name" && Name.IsNullOrEmpty()) error = "You must enter the Name field.";
            else if (propertyName == "Name" && !Name.ValidateMaximumLength(127)) error = propertyName.GetMaximumLengthError(127);
            ...
            else if (propertyName == "Description" && !Description.ValidateMaximumLength(512)) error = propertyName.GetMaximumLengthError(512);
        
        return error;
    

最后,要使您的数据类型可验证,只需在您的视图模型中执行此操作:

dataType.IsValidatable = true;

要停止验证,只需在您的视图模型中执行此操作:

dataType.IsValidatable = false;

这很容易扩展...如果您为数据类型定义了自定义集合,您可以简单地遍历每个集合项并将IsValidatable 属性设置为输入值:

collection.IsValidatable = true;

【讨论】:

这是我同事的建议。对我来说,WPF 没有内置机制似乎很奇怪。但更普遍的问题是什么是公认的范式? 你应该听他们的。当 .NET 类不提供某些功能时,这是令人沮丧的,但最好还是接受它并继续前进。这个应该已经被内置到IDataErrorInfo 接口中(以及同时处理多个错误的能力),但事实并非如此。幸运的是,只需添加 bool 属性即可轻松解决这种情况。至于公认的范式……被谁接受了?其他人是否也使用相同的技术真的很重要吗?对我个人而言,这一直是一种享受。 接受范式是指用户在输入任何内容之前看到验证错误。至于我关心的解决方案a)它有效,b)它有多好。所以你的绝对是优雅的。 这个词的用法很奇怪,但是在这个系统中,当您不进行验证 (dataType.IsValidatable = false) 时,不会出现验证错误。当您进行验证时,可能会出现验证错误,这显然取决于用户输入。

以上是关于在用户将数据输入字段之前如何防止验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止所有表单字段在填写单个字段时进行验证

如何防止引导验证在表单提交之前显示错误消息?

多个 JTextfield 的空字符串验证

如何在提交之前验证输入字段,如果验证正常,则显示消息块

php之表单-2(表单验证)

21PHP 表单验证