关于 IDataErrorInfo 接口的几个问题
A few questions on IDataErrorInfo Interface
我查看了几个实现 IDataErrorInfo
接口的例子,所有这些实现都有点像这样:
public string Error => null;
public string this[string columnName] {
get {
string res = null;
switch (columnName) {
case "FirstName":
if (FirstName != "test") res = "First Name Invalid!";
break;
case "LastName":
if (LastName != "test") res = "Last Name Invalid!";
break;
}
return res;
}
}
public string Error
的用途是什么以及如何使用它而不是返回 null
?在 xaml
中,其中一些示例使用了预定义样式定位 TextBox
,而其他示例使用了 Label
或 ToolTip
,如下所示:
<TextBox x:Name="Fname"
Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ToolTip="{Binding ElementName=Fname, Path=(Validation.Errors)[0].ErrorContent}" />
<Label Content="{Binding ElementName=Fname, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
当x:Name="Fname"
和ElementName=Fname
用作ToolTip
并缩短表达式(Validation.Errors)[0].ErrorContent
时,我可以避免ElementName=Fname
吗?
编辑
可能 DataAnnotations
是验证个人 属性 以及整个 model/viewmodel 以及这些的最优雅的方法:
public string Error => null;
public string this[string columnName] {
get {
var validationResults = new List<ValidationResult>();
if (Validator.TryValidateProperty(
GetType().GetProperty(columnName).GetValue(this),
new ValidationContext(this) { MemberName = columnName },
validationResults
)) return null;
return validationResults.First().ErrorMessage;
}
}
为了验证整个模型,我应该调用:
Validator.TryValidateObject(this, new ValidationContext(this), null, true);
在 CanExecute
中 ICommand
。这个例子也没有使用 public string Error
.
WPF 绑定引擎会忽略 Error
属性,因此您只需关心实现索引器。
顺便说一句,自 .NET Framework 4.5 以来,建议实现和使用 INotifyDataErrorInfo
接口而不是 IDataErrorInfo
。
我查看了几个实现 IDataErrorInfo
接口的例子,所有这些实现都有点像这样:
public string Error => null;
public string this[string columnName] {
get {
string res = null;
switch (columnName) {
case "FirstName":
if (FirstName != "test") res = "First Name Invalid!";
break;
case "LastName":
if (LastName != "test") res = "Last Name Invalid!";
break;
}
return res;
}
}
public string Error
的用途是什么以及如何使用它而不是返回 null
?在 xaml
中,其中一些示例使用了预定义样式定位 TextBox
,而其他示例使用了 Label
或 ToolTip
,如下所示:
<TextBox x:Name="Fname"
Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ToolTip="{Binding ElementName=Fname, Path=(Validation.Errors)[0].ErrorContent}" />
<Label Content="{Binding ElementName=Fname, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
当x:Name="Fname"
和ElementName=Fname
用作ToolTip
并缩短表达式(Validation.Errors)[0].ErrorContent
时,我可以避免ElementName=Fname
吗?
编辑
可能 DataAnnotations
是验证个人 属性 以及整个 model/viewmodel 以及这些的最优雅的方法:
public string Error => null;
public string this[string columnName] {
get {
var validationResults = new List<ValidationResult>();
if (Validator.TryValidateProperty(
GetType().GetProperty(columnName).GetValue(this),
new ValidationContext(this) { MemberName = columnName },
validationResults
)) return null;
return validationResults.First().ErrorMessage;
}
}
为了验证整个模型,我应该调用:
Validator.TryValidateObject(this, new ValidationContext(this), null, true);
在 CanExecute
中 ICommand
。这个例子也没有使用 public string Error
.
WPF 绑定引擎会忽略 Error
属性,因此您只需关心实现索引器。
顺便说一句,自 .NET Framework 4.5 以来,建议实现和使用 INotifyDataErrorInfo
接口而不是 IDataErrorInfo
。