2010-04-09 2 views
2

Я имею дело с большим приложением WPF, которое выводит большое количество ошибок привязки. Типичная ошибка выглядит так:Локальные ошибки привязки

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment') 

Проблема в том, что я не знаю, где в приложении это происходит. Поиск всего решения для AncestorType = {x: Type ItemsControl} не требуется, так как я до сих пор не знаю, какой результат является виновником. Я попытался установить PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.All; , но дополнительная информация не помогает найти проблемные привязки. Имена файлов и номера строк действительно нужны мне. В любом случае, чтобы получить эту информацию? Единственное другое решение, которое я могу придумать, - это назначить имена канадежам, а затем сузить их оттуда. В этом ключе, есть ли способ автоматически назначить уникальное имя x: Name всем элементам, которые можно найти в решении?

+0

Yeh ... одна из проблем WPF .. – Dani

ответ

1

Когда вы видите эти ошибки привязки? Только во время запуска (или загрузки нового AddIn, или нового представления и т. Д.).

В таких случаях я обнаружил, что эти ошибки часто являются «ложными срабатываниями», поскольку они выбрасываются до того, как объект, связанный с ним, инициализируется. Это, конечно, раздражает, но если все в вашем приложении, похоже, правильно связано (здесь, например, у ваших меню, похоже, есть правильный HorizontalContentAlignment), то я бы тоже не беспокоился .

+0

Я вижу много ошибок привязки. Хотя некоторые из них могут быть «ложными срабатываниями», большинство из них (судя по исправлениям, которые я уже сделал). Итак, я все еще ищу ответ на свой первоначальный вопрос. – user227389

3

Обычно я устанавливаю точку останова на код, который фактически записывает сообщение об ошибке. Когда ударяется точка останова, я проверяю визуальное дерево объекта, у которого была ошибка привязки, с помощью визуализатора Visual Studio. Это почти всегда говорит мне, где именно в моем коде найти привязку и исправить ее. (Вы можете определить, где установить точку останова, установив пользовательский прослушиватель трассировки и взломать его, а затем проверить стек вызовов.)

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

+0

Спасибо за предложение, но я уже пробовал его, и трассировка стека почти пуста: > BindingListener.WriteLine (строковое сообщение) Строка 78 \t C# > [Внешний код] – user227389

+1

Aha! Я вижу твою проблему. Большая часть трассировки стека скрыта, потому что ваша установка Visual Studio настроена на скрытие внешнего кода в трассировке стека. Это действительно помешает вашей отладке, потому что вы не можете видеть полные трассировки стека или исследовать параметры и локальные переменные вне вашего собственного кода. Я считаю, что процедура исправления заключается в отключении «Включить только мой код» на вкладке «Отладка» в разделе «Инструменты»> «Параметры», затем щелкните правой кнопкой мыши трассировку стека и выберите «Показать внешний код». –

+0

Ничего себе, как легко это может быть, если вы знаете, как это сделать. Это помогло мне. Я просто должен был посмотреть на серые элементы трассировки стека. – Thorsten79

0

Звучит как этот Xceed колонка CHOOSER ошибка: http://xceed.com/CS/forums/thread/25140.aspx http://xceed.com/CS/forums/ShowThread.aspx?PostID=26315 & PermaPostID = 26029

У меня та же проблема, хотя обходные пути, упомянутые в этом сообщении, не работают для меня. Возможно, они будут работать на вас.

Смежные вопросы