Я следую этому примеру из MSDN
Обработка ошибок и исключений, возникающих при привязке данных (тот же пример и здесь)
Идея этого примера:
BindingSource и Binding. Бизнес-объект - это Модель.BindingComplete. Если было исключение, оно было перехвачено, и сообщение об исключении доступно через BindingCompleteEventArgs. Таким образом сообщения об ошибках проверки могут поступать обратно на уровень представления.Все идет нормально.
Вот странная часть. Перехват исключения, создаваемого бизнес-объектом, зависит от версии .NET.
BindingComplete запускается. Аргументы события указывают на то, что привязка не была успешной. Как и ожидалось.Тот же исходный код скопирован из примера Microsoft. Я меняю только версию .NET в свойствах проекта.
Аналогичный подход также был предложен в этом более раннем потоке: Связывание данных и исключение исключения в сеттере (2009 г.)
ветка на форуме MSDN (2010), который предлагает создать исключение в событии Binding.Parse.
[Любопытно, что привязка данных происходит, даже если для e.Cancel установлено значение true в обработчике событий Control.Validating. Это особенность?]
Using exceptions for user input validation isn't great.
Я согласен. В то же время установщики свойств в модели должны проверять параметры и генерировать исключения, если параметр является мусором. Не может быть модели, которая принимает недопустимые параметры.
Сказав это, я открыт и для других идей. Есть ли другой способ для модели выполнить проверку ввода и отправить информацию об ошибке проверки в презентацию?
That example is WinForms. Why don't you use WPF?
Я использую WinForms из-за устаревания.





Похоже, это разница в том, что классифицируется как исключение необработанный пользователем в .Net 3.5 и .Net 4+. Это изменение могло не произойти с .Net 4.0, поскольку .Net 4.5+ заменяет .Net 4 на месте.
Рассмотрим следующую конфигурацию для System.Exception, которая задается в установщике свойств предметного кода. Следующие изображения были сняты с VS2013. VS2015 + использует другой диалог настроек исключения (см .: Окно настроек нового исключения в Visual Studio 2015). Чтобы увидеть параметр необработанный пользователем, вам необходимо включить отладку «Just-My-Code».
При компиляции в .Net 4.7 отладчик сломается при возникновении исключения. Однако при компиляции с .Net 3.5 отладчик не сломается при возникновении исключения.
Если вы снимите флажок «Прерывание, когда этот тип исключения не обрабатывается пользователем», вы получите то же поведение, что и 3.5. Если вы работаете без подключенного отладчика, поведение будет одинаковым независимо от версии .Net.
«Версии .NET 4.0, 4.5, 4.5.2 не улавливают исключение в установщике свойств модели». - Думаю, вы имели в виду: «Версии .NET 4.0, 4.5, 4.5.2 улавливают исключение в установщике свойств модели». Тем не менее, похоже, что это изменение в обработке необработанных исключений с подключенным отладчиком. Если вы снимите флажок «Прерывание, когда этот тип исключения не обрабатывается пользователем», вы получите то же поведение, что и 3.5. Если вы работаете без подключенного отладчика, поведение будет таким же, независимо от версии .Net.