如何输入任何内容时如何禁止验证

Ale*_*man 31 .net data-binding validation wpf

我使用WPF数据绑定实现IDataErrorInfo接口的实体.一般来说,我的代码如下所示:

商业实体:

public class Person : IDataErrorInfo 
{
  public string Name { get; set;}

  string IDataErrorInfo.this[string columnName]
  {
    if (columnName=="Name" && string.IsNullOrEmpty(Name))
      return "Name is not entered";
    return string.Empty;
  }  
}
Run Code Online (Sandbox Code Playgroud)

Xaml文件:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=true}" />
Run Code Online (Sandbox Code Playgroud)

当用户点击"创建新人"后执行以下代码:

DataContext = new Person();
Run Code Online (Sandbox Code Playgroud)

问题是,当刚创建person时,其名称为空,WPF会立即绘制红框并显示错误消息.我希望它仅在名称已编辑且焦点丢失时显示错误.有人知道这样做的方法吗?

Sta*_*zev 16

只有在更改了Name属性时,才能将您的person类更改为触发验证错误:

public class Person : IDataErrorInfo {

    private bool nameChanged = false;
    private string name;
    public string Name {
        get { return name; }
        set { 
            name = value;
            nameChanged = true;
        }
    }

//... skipped some code

    string IDataErrorInfo.this[string columnName] {
        get {
            if(nameChanged && columnName == "Name" && string.IsNullOrEmpty(Name)) 
                return "Name is not entered"; 
            return string.Empty;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我可以,但我想调整WPF绑定,而不是改变我的业务实体.由于我不是WPF专家,希望有这样的问题相对容易解决.这似乎是典型的行为 - 当窗体刚打开时不显示所有字段的警报. (5认同)
  • 我不认为这可以在XAML或Binding设置级别进行控制.数据是正确的还是不正确的,所以由IDataErrorInfo来验证它.或者,您可以检查"if(columnName =="Name"&& Name =="")",从而将初始"null"视为有效,在编辑时将变为无效的空字符串.想不出任何其他方式. (2认同)
  • 我不喜欢这个,如果你有50个,100个属性,这开始变得笨重,并且需要很多代码.无论采用何种方式,BTW WPF验证都是可怕的.没有干净的方法来处理它. (2认同)

小智 5

我找到了另一个解决方案,但我不喜欢它.您必须清除页面加载的验证.

我的意思是你必须这样做:

Validation.ClearInvalid(...) 例如,如果你有一个文本框,你不想要验证应该打电话

Validation.ClearInvalid(txtSomething.GetBindingExpression(TextBox.TextProperty)) 或类似的东西.

您应该为要清除验证的每个控件执行此操作.

我不喜欢这个解决方案,但那是我发现的最好的解决方案.我希望wpf有一些"开箱即用"的东西有效,但没有找到它.