自定义验证属性不适用于数字版本

时间:2015-08-31 20:47:06

标签: c# wpf validationattribute

我有一个用于验证小数属性的自定义验证属性

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(); }
    }

现在它正是我所需要的。

请发表您的意见,提出建议,并提供更好的解决方案。

2 个答案:

答案 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;