DataAnnotations MVVM中的验证无效

时间:2016-01-05 10:50:10

标签: c# wpf xaml

验证无效的可能原因是什么?

public class DatabaseObj : ValidatableModel, IFormattable
{
    [Required(ErrorMessage="Hostname is required")]
    public string Hostname
    {
        get { return _hostname; }
        set { SetProperty(ref _hostname, value); }
    }
}

[Serializable]
public abstract class ValidatableModel : Model, INotifyDataErrorInfo
{
}

[Serializable]
public abstract class Model : INotifyPropertyChanged
{
}

在xaml中,

<TextBox Text="{Binding DatabaseObj.Hostname, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
             Grid.Column="1" Grid.Row="1" Margin="0,1,91,10" HorizontalAlignment="Stretch"/>

然而,当我编译并运行时,我清空文本框并且没有显示错误消息,颜色仍然保持不变。

*对象类的更新

1 个答案:

答案 0 :(得分:0)

WPF中没有对DataAnnotations的默认支持。有两种方法可以在WPF中实现验证。

  1. 使用基于异常的验证。在数据绑定表达式中,您可以打开异常验证,如下面的代码所示:

    <TextBox Name=«age» Grid.Row=«1» Grid.Column=«1» Width=«200» Margin=«5» Text="{Binding Path=Age, ValidatesOnExceptions=true, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged}" />
    

    然后,在您的模型中,您可以使用数据类型的默认逻辑,它将验证输入值(例如,它将阻止为Int32类型设置非数字值)。或者,您可以使用属性设置器中的异常来添加自定义逻辑:

    public int Age 
    { 
        get { return age; }
        set
        {
            if(value < 0)
                throw new ArgumentException("Age can't be less then zero");
            if(value > 30)
                throw new ArgumentException("Huh, no, too old for me");
            age = value;
            OnNotifyPropertyChanged();
        }
    }
    
  2. 在班级中实施IDataErrorInfoMSDN上有一个指南。

    public string Error
    {
        get
        {
            return null;
        }
    }
    
    public string this[string name]
    {
        get
        {
            string result = null;
    
            if (name == "Age")
            {
                if (this.age < 0)
                {
                    result = "Age can't be less then zero";
                }
                if(this.age > 30)
                {
                    result = "Huh, no, too old for me";
                }                   
            }
            return result;
        }
    }
    
  3. 互联网上有很多文章(12)可以使用DataAnnotations进行验证,然后您可以添加本文中的软件包并修改代码以实现您的方案。