如何防止验证,直到用户将数据输入到一个领域?(How to prevent validation u

2019-10-20 02:19发布

我有定期的控制WPF形式:组合框,文本编辑等。

我使用的标准WPF验证:

  1. 视图模型强制属性都必需属性瓦特/消息
  2. 视图模型实现IDataErrorInfo的
  3. 强制控制具有ValidatesOnDataErrors =真,NotifyOnValidationError在装订=真

当显示有新视图模型的形式强制性控制都装饰瓦特/错误范本。 对我来说,似乎是WPF验证如何假设和设计工作。

其他人对我的团队认为(恭敬地),这是不能接受的做法,以显示用户验证错误用户输入任何数据之前。

这对我来说很有意义。 所以,如果我要显示验证错误用户输入的数据后,才需要以某种方式暂停验证,直到用户输入数据,然后触发验证。 对我来说,这似乎是重塑车轮。

Answer 1:

还有就是要“忽略”的有效性的一个非常简单方法IDataErrorInfo接口。 现在,不同的开发商将实现他们的验证方式不同,但在某些阶段,在一些位置,我们都将有一些if ... else语句。 该解决方案将要求你添加一个bool属性数据类型的类(ES),或最好是基类的数据类型,如果你有一个:

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

当然,你需要通知INotifyPropertyChanged.PropertyChanged改变这个属性的事件,所以请不要按照上述我懒的例子。 现在,你可能已经猜到了该解决方案的其他...它只是涉及到一个额外的if声明,无论你已经定义了验证conditons:

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;


文章来源: How to prevent validation until the user enters data into a field?