我正在努力尝试在WPF中实现验证,并遇到一个问题,我无法在验证失败后点击或更改文本框的值。
我有一个User类(实现IDataErrorInfo),它包含以下相关代码:
public virtual string Error
{
get
{
return null;
}
}
public virtual string this[string name]
{
get
{
string result = null;
if (name == "uFirstName")
{
if (String.IsNullOrEmpty(this.uFirstName))
{
return "Must enter a first name!";
}
}
return result;
}
}
然后,在我的MainWindow代码隐藏中,我有这个代码来连接我的组合框:
comboBox1.ItemsSource = Users; //Users is a collection of Users
最后,在我的MainWindow xaml中,我有这个:
<ComboBox Name="comboBox1" ItemTemplate="{StaticResource userTemplate}" />
<TextBox Name="textBox1" DataContext="{Binding ElementName=comboBox1,
Path=SelectedItem}" Text="{Binding Path=uFirstName, ValidatesOnDataErrors=True,
NotifyOnValidationError=True}"/>
事实上,当我删除文本并且文本框获得漂亮的红色边框时,验证会触发。但是,更改仍会发送回用户(uFirstName设置为空!)。更糟糕的是,我现在无法编辑该文本框中的值,除非我标签重新加入。
如果值无效,则需要确保该值不被发回,如果无效则允许编辑文本框?
答案 0 :(得分:0)
IDataErrorInfo实现仅用于报告错误。您应该在uFirstName属性中实现验证。如果您认为某个属性的某个验证对所有实例都不正确,那么您应该开始研究ValidationRule
。这是在WPF中实现验证的更好方法。如果验证失败,ValidationRule将不会为源设置值。
由于系统级别的风格,文本框可能会表现得很奇怪?不确定你为什么遇到麻烦。