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)
小智 5
我找到了另一个解决方案,但我不喜欢它.您必须清除页面加载的验证.
我的意思是你必须这样做:
Validation.ClearInvalid(...) 例如,如果你有一个文本框,你不想要验证应该打电话
Validation.ClearInvalid(txtSomething.GetBindingExpression(TextBox.TextProperty)) 或类似的东西.
您应该为要清除验证的每个控件执行此操作.
我不喜欢这个解决方案,但那是我发现的最好的解决方案.我希望wpf有一些"开箱即用"的东西有效,但没有找到它.