Сообщение об ошибке связывания WPF появляется, когда связывание работает нормально - PullRequest
3 голосов
/ 25 апреля 2010

Я пытаюсь создать собственный шаблон / стиль TabItem в своем приложении WPF 4.0 (используя VS 2010 Pro RTM), но, несмотря на все, что кажется, работает правильно, я замечаю ошибку привязки в окне трассировки.

Словарь ресурсов XAML, который я использую для стилизации TabItems TabControl, дан полностью здесь .(Просто создайте простой TabControl с несколькими элементами и примените данный ResourceDictionary для его проверки.)

В частности, ошибка возникает из-за следующей строки (обнаруженной путем пробного тестирования и ошибок, так как Visual Studio не 't фактически сообщает об этом во время разработки.

<TranslateTransform X="{Binding ActualWidth, ElementName=leftSideBorderPath}"/>

Полная ошибка, приведенная в трассировке (окно выхода), следующая:

System.Windows.Data Ошибка: 2: Не удается найти управляющуюFrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = ActualWidth; DataItem = null; целевым элементом является TranslateTransform (HashCode = 35345840); целевым свойством является 'X' (тип 'Double')

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

И снова, хотя это не сообщается, ошибка vПохоже, что во многом это связано с тем, что я вообще привязан к любому элементу, а не к leftSideBorderPath или свойству ActualWidth.Например, изменение этой строки следующим образом исправляет:

<TranslateTransform X="25"/>

К сожалению, жесткое кодирование значения на самом деле не вариант.

Эта проблема мне кажется очень странной в этомпривязка, кажется, дает правильные результаты.(Проверка значения X для TranslateTransform во время выполнения четко показывает правильное значение привязки, и ClipGeometry при просмотре - это именно то, что и должно быть.) Кажется, ни Visual Studio, ни WPF не дают мне никакой дополнительной информации о причине ошибки.(установка PresentationTraceSources.TraceLevel в High не помогает), но тот факт, что все работает, несмотря на сообщаемую ошибку, заставляет меня думать, что это какая-то баговая ошибка WPF.

В качестве примечания,дизайнер Visual Studio WPF и редактор XAML вызывают у меня проблему со следующей строкой:

<PathGeometry Figures="{Binding Source={StaticResource TabSideFillFigures}}"/>

Хотя WPF (во время выполнения) идеально подходит для привязки рисунков к строке TabSideFillFigures, причем привязка заставляет использоватьTypeConverter, редактор XAML и дизайнер WPF жалуются.Весь код XAML для ControlTemplate подчеркнут, и я получаю следующие ошибки в списке ошибок:

Ошибка 9
'{DependencyProperty.UnsetValue}' не является допустимым значением для 'System.Windows.Controls.Control.Template 'свойство в Setter.
C: \ Users \ Alex \ Documents \ Visual Studio 2010 \ Projects \ Ircsil \ devel \ Ircsil \ MainWindow.xaml 1 1 Ircsil

Ошибка 10 Ссылка на объект не установлена ​​для экземпляра объекта.
C: \ Users \ Alex \ Documents \ Visual Studio 2010 \ Projects \ Ircsil \ devel \ Ircsil \ Skins \ Default \ MainSkin.xaml 58 17 Ircsil

Опять же, повторюсь, все прекрасно работает во время выполнения, что делает это особенно странным ...

Может кто-то, возможно, пролить некоторый свет на эти проблемы, в частности первый (которыйкажется потенциальной ошибкой WPF), и последняя (которая, похоже, ошибка Visual Studio).Буду признателен за любые отзывы и предложения!

Редактировать:

Я загрузил полное решение (это довольно небольшой проект) на свой сервер в виде ZIP-файла .Вы должны сразу увидеть ошибки и готовы к тестированию.

Ответы [ 2 ]

1 голос
/ 12 июля 2010

Довольно часто можно увидеть некоторые из этих ошибок привязки, о которых сообщалось в выходных данных. Это просто проблема времени загрузки. Чтобы не допустить шума на выходе, вы можете отключить сообщения трассировки для конкретной привязки:

    ...
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    ...

    <Binding ... diag:PresentationTraceSources.TraceLevel="Off" />
0 голосов
/ 18 июля 2012

Я понимаю, что это старый пост, но для любых текущих зрителей, попробуйте следующее:

<TranslateTransform X="{Binding ActualWidth, ElementName=leftSideBorderPath,
    FallbackValue=0.0}" />

Это установит значение X на 0.0, прежде чем оно сможет прочитать значение из ActualWidth и удалить ошибку.

...