引言
除了使用CommunityToolkit.Mvvm工具包的ObservableValidator,.Net 抽象类VlidationRule也可以让我们实现自定义验证方法,但验证很受限,只能对当前值进行判断,无法获取对象的上下文。
ValidationRule
功能:验证值是否在0~100之间。
public class MyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
double myValue = 0;
if (double.TryParse(value.ToString(), out myValue))
{
if (myValue >= 0 && myValue <= 100)
{
return new ValidationResult(true, null);
}
}
return new ValidationResult(false, "Input should between 0 and 100");
}
}
使用如下:
ValidationRules下面可以添加多个验证条件。
<TextBox Height="50" Margin="5,30,5,240" Name="tbx1" Validation.Error="tbx1_Error">
<TextBox.Text>
<Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
<Binding.ValidationRules>
<hc:RegexRule Type = "Number"/>
<local:MyValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
ValidationAttribute
提供一个验证特性的基类,来自System.ComponentModel.DataAnnotations
其下有两个可重写方法用于编写验证方法。
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
public virtual bool IsValid(object value);
第一个方法的重载请看下方链接:
CommunityToolkit.Mvvm_c# 查 communitytoolkit.mvvm. 的生成代码-CSDN博客
第二个方法重载用于轻量方法编写,当已经重写了第一个方法时再重写第二个不生效,代码不会进入。
public partial class Config : ObservableValidator
{
[ObservableProperty]
string name = "json";
private float _value;
[Required]
[Range0_100]
public float Value
{
get { return _value; }
set { SetProperty(ref _value, value, true); }
}
}
public class Range0_100Attribute: ValidationAttribute
{
public override bool IsValid(object value)
{
double myValue = 0;
if (double.TryParse(value.ToString(), out myValue))
{
if (myValue >= 0 && myValue <= 100)
{
return true;
}
}
return false;
}
}