使用验证规则生成错误时如何设置默认值?

时间:2012-01-25 03:03:29

标签: c# wpf validation validationrules inotifydataerrorinfo

我正在使用验证规则来显示自定义消息,并使用INotifyDataError来处理业务规则。

我的代码的这一部分:

public class ResponseValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int? response;
        bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response);


        if (!noIllegalChars)
        {
            return new ValidationResult(false, "Input is not in a correct format.");
        }
        else
        {
            value = null;
            return new ValidationResult(true, null);
        }
    }

    ... 
}

验证是针对Nullable数据类型的,我的意思是该值可以是null或整数,但不是像“5b”那样的错误输入。

问题是它何时产生此错误(noIllegalChars = true),如何将属性值设置为null?

编辑:我这样做的原因是,当用户将文本框留空时(值将为“”)并且从技术上讲,对于属性为null值,但是它试图将“”设置为财产。

3 个答案:

答案 0 :(得分:1)

技术上 - 您可以通过引用传递值:

public override ValidationResult Validate(ref object value, System.Globalization.CultureInfo cultureInfo)

哲学 - 您希望验证规则更改值,还是只是通知值不好?从用户的角度来看,如果我尝试输入一些值并且系统告诉我它无效,可能会很烦人,但是我没有机会更正它,只是重新开始。

如果代码要求进行验证,则希望将值设置为null,这是您的选择:

int? result;
string input = "5b"

ValidationResult response = ResponseValidation().Validate(input, CultureInfo.CurrentCulture);
if (!response.IsValid) 
    result = null;
else
    result = int.Parse(input, CultureInfo.CurrentCulture);

只是我的2美分......

答案 1 :(得分:0)

除非值是参考参数,否则你不能这样做。如果你试图分离逻辑,那么关于数据是否有效的决定应该与你想做的决定不同,例如清除输入字段。

例如:

if (!rule.Validate(val, CultureInfo.CurrentCulture).IsValid)
{
    //Clear the field... whatever else you want to do
}

答案 2 :(得分:0)

之前的答案已经提到将值传递给Validate函数byref - 不仅在语法上它们提到不正确,而且如果你创建一个重载的Validate函数来执行此操作,那么绑定子系统将不会调用如果您在XAML中声明验证规则。当然它可以通过编程方式调用,但如果您开始使用只能以这种方式访问​​的代码创建ValidationRules,那么您就是在自己的脚下拍摄。

更合适的操作是在字段上使用转换器,如果传入空字符串,则返回默认值int?