我有一个用于验证十进制属性的自定义验证属性
public sealed class DecimalAttribute : ValidationAttribute
{
public DecimalAttribute()
{
this.ErrorMessage = "The input must be a decimal number";
}
private object Value { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
this.Value = value;
return base.IsValid(value, validationContext);
}
public override bool IsValid(object value)
{
if (this.Value == null) return false;
decimal result;
return decimal.TryParse(this.Value.ToString(), out result);
}
}
但是,当它不起作用并且当我将文本框绑定到该属性并将无效值输入到文本框中时,将显示消息“无法转换值”而不是我的自定义验证属性的错误消息。
有趣的是,我发现像“必需”这样的其他验证属性也不适用于数字属性。
编辑
我的绑定部分是:
<TextBox>
<TextBox.Text>
<Binding Path="Price" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
<Binding.ValidationRules>
<local:DecimalValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
我的解决方案
这就是我解决问题的方法。我不确定这是否是最好的方式,但是我会为您的任何建议分享它。
我实际上使用了两个属性,一个用于绑定和验证,另一个用于在数据库中保存数据
[NotMapped, Decimal]
public string PriceString
{
get { return _priceString; }
set { if (SetValue(ref _priceString, value)) OnPropertyChanged("Price"); }
}
public decimal Price
{
get
{
decimal result;
decimal.TryParse(this.PriceString, out result);
return result;
}
set { PriceString = value.ToString(); }
}
现在它完全符合我的需要。
请发表您的意见,提出您的建议并提供更好的解决方案。