我有一个用于验证小数属性的自定义验证属性
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(); }
}
现在它正是我所需要的。
请发表您的意见,提出建议,并提供更好的解决方案。
答案 0 :(得分:0)
在类声明上方添加[AttributeUsage(AttributeTargets.Property)]。
[AttributeUsage(AttributeTargets.Property)]
public sealed class DecimalAttribute : ValidationAttribute
答案 1 :(得分:0)
您需要将ValidationAttribute添加到您的媒体资源
[DecimalAttribute] // <-- this part is missing
public decimal Price
{
// get set
}
你也可能需要
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;