当绑定看起来正常工作时,报告WPF绑定错误

3
我正在尝试在我的WPF 4.0应用程序中(使用VS 2010 Pro RTM),创建自定义的TabItem模板/样式,但是尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定错误。
我用来为TabControl的TabItems设置样式的资源字典XAML在此处here给出。(只需创建一个简单的TabControl并将给定的ResourceDictionary应用于测试即可。)
具体而言,由于以下行导致了错误(通过试错测试发现的,因为Visual Studio实际上没有在设计时报告它)。
<TranslateTransform X="{Binding ActualWidth, ElementName=leftSideBorderPath}"/>

在跟踪(输出窗口)中给出的完整错误如下:

System.Windows.Data Error: 2 : 无法找到目标元素的主控 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=ActualWidth; DataItem=null; target element is 'TranslateTransform' (HashCode=35345840); target property is 'X' (type 'Double')

该错误在加载时发生,重复出现5次,然后(请注意,示例中有3个选项卡)。每当调整窗口大小时,例如填充输出窗口时,它也会一致且重复地出现。也许每次 TabItem 布局更新时都会发生?

再次说明,尽管没有报告,但错误非常可能是因为我绑定到 任何 元素,而不是特定的 leftSideBorderPath 或 ActualWidth 属性。例如,将此行更改为以下内容即可修复问题。

<TranslateTransform X="25"/>

不幸的是,硬编码值并不是一个真正的选项。

这个问题对我来说似乎非常奇怪,因为绑定似乎给出了正确的结果。(在运行时检查TranslateTransform的X值清楚地显示了正确的绑定值,并且查看ClipGeometry时也完全符合预期。)无论是Visual Studio还是WPF似乎都没有给我更多关于错误原因的信息(将PresentationTraceSources.TraceLevel设置为High也没有帮助),然而尽管报告了错误,事情仍然在工作,这让我倾向于认为这是一些边缘案例的WPF bug。

顺便说一句,Visual Studio WPF设计师和XAML编辑器在以下行中给我带来了问题:

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

尽管在运行时,WPF可以将图形绑定到TabSideFillFigures字符串,并通过绑定强制使用TypeConverter,但XAML编辑器和WPF设计器会发出警告。控件模板的所有XAML代码都被下划线标记,并且在错误列表中出现以下错误:
错误9:'{DependencyProperty.UnsetValue}'不是Setter上'System.Windows.Controls.Control.Template'属性的有效值。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

在输出中经常会看到一些绑定错误的报告,这只是一个加载时间问题。为了使输出更加清晰,您可以关闭特定绑定的跟踪消息:

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

    <Binding ... diag:PresentationTraceSources.TraceLevel="Off" />

嗨,史蒂文 - 我相信你的意思是“None”,而不是“Off”。此外,这对于某些绑定错误没有任何影响,例如当找不到相对源时。目前无法抑制这些类型的错误。 - CodeNaked

1

我知道这是一篇旧帖子,但对于任何当前的观众,请尝试以下方法:

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

在读取ActualWidth的值之前,将X值设置为0.0,以消除错误。


1
在这种情况下,出现了绑定警告而不是绑定错误。 - BalintPogatsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接