Я не получаю ожидаемого поведения для TextBox, привязанного к целочисленному свойству в бизнес-объекте.
Вот что я сделал:
(1) Установите DataSourceUpdateMode
, для TextBox: OnValidation
.
(2) В событии Validating
для TextBox установите e.Cancel = True
, если Integer.TryParse завершится неудачей.
(3) Добавьте обработчик к Binding.Parse
и Binding.BindingComplete
и установите точки останова в обработчиках.
Запустите приложение, поместите «asdasd» в TextBox и откройте вкладку.
Несмотря на установку e.Cancel = True
, оба события Parse
и BindingComplete
возникают.
Согласно документации, настройка e.Cancel = True
должна подавлять дальнейшую логику.
Я искал MSDN, чтобы выяснить, почему это происходит, но я ничего не могу найти. Кто-нибудь знает, где я могу рассказать об этом подробнее?
ETA : Я также добавил дескриптор события Validated. Вот последовательность событий:
Неверные данные:
(1) Проверка. (Я установил e.Cancel = True
)
(2) Parse
(3) BindingComplete
Хорошие данные:
(1) Проверка
(2) Parse
(3) BindingComplete
(4) Утверждено
ETA2 : немного больше информации и обходной путь.
Проблема с этим поведением заключается в том, что у вас есть некоторая проверка, которая не реализована в установщике свойств.
Например, допустим, мое целочисленное свойство должно быть нечетным числом. Я не проверяю это в установщике свойств, поэтому я проверяю событие проверки.
Как видно из приведенного выше поведения, значение в виде допустимого целого числа будет записано в источник данных, даже если я отменю проверку.
Несмотря на то, что источник данных обновлен, если вы установили Cancel в событии проверки, событие Validated не будет запущено, поэтому вы все равно можете предотвратить прогресс пользователя.
обходным ::
Чтобы остановить обновление источника данных, необходимо выполнить проверку в событии Binding.Parse
и выдать исключение, которое препятствует успешному завершению привязки.