Порядок проверки WPF между IDataErrorInfo и исключением - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть элемент управления, который имеет ValidatesOnDataErrors = true и ValidatesOnExceptions = true. У меня также есть кое-что, смотрящее коллекцию Validation.Errors на эту привязку.

Пользователь вводит значение, которое может быть преобразовано (без исключения), но недопустимо (IDataErrorInfo сообщает об ошибке). Ошибка появляется в коллекции ошибок и отображается, как и ожидалось.

Затем пользователь вводит значение, которое не может быть преобразовано (исключение выдается). IDataErrorInfo по-прежнему сообщает о той же ошибке, что и раньше (поскольку значение модели не изменилось).

В этом последнем случае я бы предпочел видеть в списке только ошибку исключения, но допускал бы наличие и исключения, и ошибки данных (в любом порядке).

Однако в действительности происходит только то, что в списке появляется только ошибка данных, которая в результате дает пользователю вводящее в заблуждение сообщение об ошибке (поскольку это ошибка предыдущего введенного значения, а не текущего).

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

Есть идеи, как получить из этого желаемое поведение?

(Откат на шаг: я пытаюсь объединить проверку IDataErrorInfo [так как это более удобно для тестов на уровне домена), но все же обращая внимание на исключения пользовательского интерфейса [в противном случае он игнорировал бы случай, когда пользователь вводит что-то совершенно глупое]. Я не хочу доводить до крайности превращение каждого свойства ВМ в строку или другую подобную ерунду.

1 Ответ

0 голосов
/ 14 марта 2011

ValidatesOnDataError и ValidatesOnExceptions - это просто вспомогательные свойства, которые добавляют экземпляры DataErrorValidationRule и ExceptionValidationRule 1010R Valid * коллекция соответственно.

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

<Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged">
    <Binding.ValidationRules>
        <ExceptionValidationRule />
        <DataErrorValidationRule />
    </Binding.ValidationRules>
</Binding>
...