验证无效的可能原因是什么?
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"/>
然而,当我编译并运行时,我清空文本框并且没有显示错误消息,颜色仍然保持不变。
*对象类的更新
答案 0 :(得分:0)
WPF中没有对DataAnnotations的默认支持。有两种方法可以在WPF中实现验证。
使用基于异常的验证。在数据绑定表达式中,您可以打开异常验证,如下面的代码所示:
<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();
}
}
在班级中实施IDataErrorInfo。 MSDN上有一个指南。
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;
}
}
互联网上有很多文章(1,2)可以使用DataAnnotations进行验证,然后您可以添加本文中的软件包并修改代码以实现您的方案。