【问题标题】:Can't click textbox after validation fails验证失败后无法单击文本框
【发布时间】:2012-08-15 22:03:48
【问题描述】:

我正在尝试在 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 被设置为空!)。更糟糕的是,我现在无法编辑该文本框中的值除非将其返回

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

【问题讨论】:

    标签: c# wpf validation binding


    【解决方案1】:

    IDataErrorInfo 实现仅用于报告错误。您应该在 uFirstName 属性中实现您的验证。如果您认为某个属性的某个验证并非适用于所有实例,您应该开始查看ValidationRule。这是在 WPF 中实现验证的更好方法。如果验证失败,ValidationRule 不会为源设置值。

    文本框可能因为系统级别的样式而表现得很奇怪?不完全确定您在那里遇到问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2021-03-31
      • 2014-05-08
      • 2013-07-25
      • 2022-12-09
      相关资源
      最近更新 更多