验证失败后无法单击文本框

时间:2012-08-15 22:03:48

标签: c# wpf validation binding

我正在努力尝试在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设置为空!)。更糟糕的是,我现在无法编辑该文本框中的值,除非标签重新加入

如果值无效,则需要确保该值不被发回,如果无效则允许编辑文本框?

1 个答案:

答案 0 :(得分:0)

IDataErrorInfo实现仅用于报告错误。您应该在uFirstName属性中实现验证。如果您认为某个属性的某个验证对所有实例都不正确,那么您应该开始研究ValidationRule。这是在WPF中实现验证的更好方法。如果验证失败,ValidationRule将不会为源设置值。

由于系统级别的风格,文本框可能会表现得很奇怪?不确定你为什么遇到麻烦。