Обработка ошибок вложенных моделей с помощью вложенного IDataErrorInfo - PullRequest
0 голосов
/ 23 января 2020

У меня есть одна привязка, которая выглядит следующим образом:

<MyControl SomeProperty="{Binding VmProperty.SubProperty.SubSubProperty.Name, ValidatesOnDataErrors=True}" />

Каждый класс на пути реализует IDataErrorInfo, но в настоящее время , только мой последний класс имеет реальную проверку имени:

public string this[string propertyName]
{
    get
    {
        if (propertyName == nameof(Name))
        {
            if(someCheck){
                return "oh oh";
            }
        }

        return string.Empty;
    }
}

public string Error{
    get{
        return this[nameof(Name)];
    }
}

Теперь я изменяю значение на что-то неправильное, что я получаю:

  1. this[string propertyName] в моей последней последней подмодели вызывается правильно и возвращает ошибку
  2. this[string propertyName] на моей модели вида не вызывается (как и все остальные уровни)
  3. Элемент управления не отображает красный квадрат вокруг него (он появляется, если я связываюсь напрямую с локальное свойство моей виртуальной машины.

Итак, насколько я понимаю, что:

  1. IDataErrorInfo ошибки не передаются до привязки
  2. My IDataErrorInfo реализация модели представления не вызывается, потому что она не знает, что свойство sub-sub-sub-sub-sub было обновлено.

Как вы можете справиться с этим? Или способ быть информированным об изменении свойства sub-sub-sub-sub-sub (любой уровень может быть изменен, поэтому я регистрирую t o каждое PropertyChanged событие каждого уровня было бы очень громоздким), либо всплывают ошибки?

1 Ответ

1 голос
/ 24 января 2020

Таким образом, я понимаю, что: 1. Ошибки IDataErrorInfo не передаются до привязки

Исправлено.

Моя реализация IDataErrorInfo модели представления не вызывается, поскольку не знает, что свойство sub-sub-sub-sub-sub было обновлено.

Исправлено.

Как вы можете справиться с этим ?

Ваша дочерняя модель представления должна уведомить модель родительского представления о том, что ее состояние изменилось, и модель родительского представления должна обработать это событие.

In. NET Framework 4.5 и более поздние версии, есть новый интерфейс INotifyDataErrorInfo, который объявляет событие ErrorsChanged, которое вы можете использовать для этого. Здесь - пример того, как это реализовать.

...