Подтвердить что ты не робот

Почему WPF Swallow Databinding Exceptions?

Я участвую в процессе обучения WPF, и я озадачен тем фактом, что исключения привязки данных не вызывают исключение во время выполнения/необработанное.

Может ли кто-нибудь объяснить преимущества привязки данных таким образом? Я предполагаю, что преимущества , но до сих пор я их не вижу (отказ от ответственности: я только начинаю с привязки данных).

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

4b9b3361

Ответ 1

Я не знаю точно, но я подозреваю, потому что некуда обрабатывать исключение.

Предположим, что у вас есть что-то, чьи свойства вы хотите привязать, но иногда это что-то пустое. (Например, {Binding Name.Length}, где Name - это свойство строки, которое может быть пустым.) В этом случае вы счастливы, что это не-op, потому что вы знаете, что элемент управления никогда не будет отображаться, когда имя равно null (из-за срабатывания триггера) или потому, что вы знаете, что это будет переходное условие, в то время как источник привязки загружает свои данные.

Теперь предположим, что WPF распространял исключение NullReferenceException при попытке вызвать Length в строке нулевого имени. В процедурный код вы поймаете это исключение и проглотите его, потому что знаете, что оно было доброкачественным. Но вы не можете поместить обработчик исключений вокруг кода привязки WPF. Он вызвал откуда-то глубоко внутри WPF. Таким образом, исключение будет пузыриться вплоть до Application.Run, что не очень полезно для его поиска.

Поэтому вместо того, чтобы централизовать обработчики исключений привязки в приложении Application.Run, я думаю, что ребята WPF решили усвоить сами исключения. Только теория, хотя...

Ответ 2

Я бы сказал, что это связано с тем, что стоимость создания исключения является непомерно высокой. Текущая реализация работает даже в случае наличия некорректных привязок и в текущей форме, которая может фактически оказать очень существенное влияние на производительность. Возьмите этот пример, создайте DataGrid, который выполняет привязку, и загрузите в него 1000 записей. Измерьте производительность со всеми связями правильно и снова с одним из них неправильно. Разница значительна. Добавьте поверх этих экземпляров класса исключения, и он может выйти из-под контроля плохо. Просто мое мнение.

Ответ 3

Я не знаю, почему это поведение по умолчанию, но есть способы.

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

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

Ответ 4

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