Я рассмотрел несколько примеров реализации интерфейса 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
?
РЕДАКТИРОВАТЬ
Вероятно, DataAnnotations
является наиболее элегантным способом проверки личностисвойство, а также вся модель / модель представления вместе с этими:
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
.