0

我使用验证规则来显示自定义消息,并使用 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?

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

4

3 回答 3

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美分...

于 2012-01-25T03:21:14.683 回答
0

除非 value 是 ref 参数,否则你不能。但是,如果您尝试分离逻辑,则关于数据是否有效的决定应该与您在该决定之后想要执行的操作不同,例如清除输入字段。

例如:

if (!rule.Validate(val, CultureInfo.CurrentCulture).IsValid)
{
    //Clear the field... whatever else you want to do
}
于 2012-01-25T03:27:43.990 回答
0

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

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

于 2012-01-25T20:47:38.683 回答