У меня Model
с одним свойством.Это Model
наследуется от базовой модели, которая реализует INotifyPropertyChanged
и IDataInfoError
.Над моей собственностью у меня есть ValidationAttribute
Обязательно, с сообщением об ошибке, которое я хочу вывести во всплывающую подсказку.Поэтому у меня есть текстовое поле в моем представлении.
Мое решение: Когда текстовое поле пусто, проверка работает.Текстовое поле имеет красную рамку.Когда текстовое поле пустое, и я что-то пишу в нем, в окне вывода появляется сообщение об ошибке.
System.Windows.Data Ошибка: 17: Невозможно получить значение «Item []» (тип)ValidationError ') from' (Validation.Errors) '(тип' ReadOnlyObservableCollection`1 ').BindingExpression: Путь = (0) [0] .ErrorContent;DataItem = 'TextBox' (Name = '');целевой элемент - TextBox (Name = '');Свойство target - «ToolTip» (тип «Object»). ArgumentOutOfRangeException: «System.ArgumentOutOfRangeException: указанный аргумент находится вне диапазона допустимых значений.Имя параметра: индекс '
Воспроизвести ошибку: Модели
public class ModelBase : INotifyPropertyChanged, IDataErrorInfo
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string Error { get { return 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;
}
}
}
public class Model : ModelBase
{
private string name;
[Required(ErrorMessage = "Wrong")]
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
}
}
}
Просмотр
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True, Mode=TwoWay}"></TextBox>
</StackPanel>