我正在使用验证规则来显示自定义消息,并使用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值,但是它试图将“”设置为财产。答案 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?
。