Как сделать простую проверку с IDataErrorInfo и аннотациями данных - PullRequest
0 голосов
/ 29 ноября 2018

У меня 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>

1 Ответ

0 голосов
/ 29 ноября 2018

Нет позиции ValidationError в позиции 0, когда ваш индексатор возвращает null.Привязка к (Validation.Errors).CurrentItem.ErrorContent вместо (Validation.Errors)[0].ErrorContent должна исправить ошибку привязки:

<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                    Path=(Validation.Errors).CurrentItem.ErrorContent}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...