在用户将数据输入字段之前如何防止验证?
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
) 时,不会出现验证错误。当您进行验证时,可能会出现验证错误,这显然取决于用户输入。以上是关于在用户将数据输入字段之前如何防止验证?的主要内容,如果未能解决你的问题,请参考以下文章