1.创建数据验证规则
/// <summary>
/// 数据值验证
/// </summary>
public class ValidationExtensionRules
{
//校验数字的表达式
/// <summary>
/// 数字
/// </summary>
/// <param name="_val"></param>
/// <returns></returns>
public static ValidationResult MumberVerif(string _val)
{
string pattern = @"^[0-9]*$";
if (!Regex.IsMatch(_val, pattern))
{
return new ValidationResult("输入值数字类型!");
}
return ValidationResult.Success;
}
/// <summary>
/// 大于等于零整数
/// </summary>
/// <param name="_val"></param>
/// <returns></returns>
public static ValidationResult ZeroPlusIntVerif(int _val)
{
if (_val<0)
{
return new ValidationResult("输入值不能小于零!");
}
return ValidationResult.Success;
}
/// <summary>
/// 零和非零开头的数字
/// </summary>
/// <param name="_val"></param>
/// <returns></returns>
public static ValidationResult StartNoZeroIntVerif(string _val)
{
string pattern = @"^(0|[1-9][0-9]*)$";
if (!Regex.IsMatch(_val, pattern))
{
return new ValidationResult("输入值不能小于零!");
}
return ValidationResult.Success;
}
/// <summary>
/// 非零开头的最多带两位小数的数字
/// </summary>
/// <param name="_val"></param>
/// <returns></returns>
public static ValidationResult StartNoZeroDoubleVerif(string _val)
{
string pattern = @"^([1-9][0-9]*)+(\.[0-9]{1,2})?$";
if (!Regex.IsMatch(_val, pattern))
{
return new ValidationResult("输入值不能小于零!");
}
return ValidationResult.Success;
}
}
/// <summary>
/// 数据值验证方法名称
/// </summary>
public class ValidRulesName
{
/// <summary>
/// 数字
/// </summary>
public const string MumberVerif = "MumberVerif";
/// <summary>
/// 大于等于零整数
/// </summary>
public const string ZeroPlusIntVerif = "ZeroPlusIntVerif";
/// <summary>
/// 零和非零开头的数字
/// </summary>
public const string StartNoZeroIntVerif = "StartNoZeroIntVerif";
/// <summary>
/// 非零开头的最多带两位小数的数字
/// </summary>
public const string StartNoZeroDoubleVerif = "StartNoZeroDoubleVerif";
}
2.创建ValidationUtility错误提示
public class ValidationUtility: IDataErrorInfo
{
public string Error
{
get { return _error; }
}
public string _error;
//public string this[string columnName]
//{
// get
// {
// Type tp = this.GetType();
// PropertyInfo pi = tp.GetProperty(columnName);
// var value = pi.GetValue(this, null);
// object[] Attributes = pi.GetCustomAttributes(false);
// if (Attributes != null && Attributes.Length > 0)
// {
// foreach (object attribute in Attributes)
// {
// if (attribute is ValidationAttribute)
// {
// ValidationAttribute vAttribute = attribute as ValidationAttribute;
// if (!vAttribute.IsValid(value))
// {
// _error = vAttribute.ErrorMessage;
// return _error;
// }
// }
// }
// }
// }
//}
public string this[string columnName]
{
get
{
var vc = new ValidationContext(this, null, null);
vc.MemberName = columnName;
var res = new List<ValidationResult>();
var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res);
if (res.Count > 0)
{
return string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());
}
return string.Empty;
}
}
}
3.BaseViewModel继承ValidationUtility
public class BaseViewModel : Utility.ValidationUtility,INotifyPropertyChanged
{
#region UI更新接口
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
4.ViewModel中使用
private double _Number;
[CustomValidation(typeof(ValidationExtensionRules), ValidRulesName.MumberVerif)]
/// <summary>
/// 数字
/// </summary>
public double Number
{
get { return _Number; }
set
{
_Number = value;
OnPropertyChanged("Number");
}
}
5.控件上使用
<TextBox Width="60" Text="{Binding Number,Mode=TwoWay,UpdateSourceTrigger=LostFocus,ValidatesOnExceptions=True,ValidatesOnDataErrors=True}" />
设置TextBox 属性InputHint
<!-- 错误提示 -->
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="InputHint" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="IsOpen" TargetName="popupHint" Value="true"/>
</Trigger>