绑定似乎正常工作时报告WPF绑定错误

时间:2010-04-25 14:41:30

标签: wpf visual-studio binding

我正在尝试在我的WPF 4.0应用程序中创建一个自定义TabItem模板/样式(使用VS 2010 Pro RTM),但是尽管一切看似正常工作,我注意到跟踪窗口中存在绑定错误。

我用来设置TabControl的TabItem样式的资源字典XAML以完整here给出。 (只需创建一个包含多个项目的简单TabControl并应用给定的ResourceDictionary来测试它。)

具体来说,错误是由于以下行发生的(通过试错法测试发现,因为Visual Studio实际上并未在设计时报告它。

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

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

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= ActualWidth的;的DataItem = NULL; target元素是'TranslateTransform'(HashCode = 35345840); target属性为'X'(类型'Double')

加载时发生错误,然后重复5次(请注意,我的示例中有3个标签项)。每当调整Window的大小时,它也会一致且重复地发生,例如 - 填充“输出”窗口。也许每次更新TabItem布局?

而且,虽然没有报告,但错误似乎很大程度上是由于我绑定到任何元素,而不是特别是leftSideBorderPath或ActualWidth属性。例如,将此行更改为以下内容可以解决问题。

<TranslateTransform X="25"/>

不幸的是,对该值进行硬编码实际上并不是一种选择。

这个问题对我来说似乎很奇怪,因为绑定似乎给出了正确的结果。 (在运行时检查TranslateTransform的X值清楚地显示正确的绑定值,并且查看时的ClipGeometry正是它应该是什么。)Visual Studio和WPF似乎都没有给我任何关于错误原因的信息(将PresentationTraceSources.TraceLevel设置为High并没有帮助),但尽管报告了错误,事情仍然有效,这让我觉得这是一些边缘情况的WPF错误。

作为旁注,Visual Studio WPF设计器和XAML编辑器给我一个问题,包括以下行:

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

虽然WPF(在运行时)非常乐意将数字绑定到TabSideFillFigures字符串,但Binding强制使用TypeConverter,XAML编辑器和WPF设计者都在抱怨。 ControlTemplate的所有XAML代码都带有下划线,我在错误列表中收到以下错误:

  

错误9
  '{DependencyProperty.UnsetValue}'是   不是有效值   'System.Windows.Controls.Control.Template'   塞特犬的财产   C:\ Users \ Alex \ Documents \ Visual Studio   2010 \项目\ Ircsil \ devel的\ Ircsil \ MainWindow.xaml   1 1 Ircsil

     

错误10对象引用不是   设置为对象的实例   C:\ Users \ Alex \ Documents \ Visual Studio   2010 \项目\ Ircsil \ devel的\ Ircsil \皮肤\ DEFAULT \ MainSkin.xaml   58 17 Ircsil

同样,重复一遍,一切都在运行时完美运行,这使得这特别奇怪......

有人可能会对这些问题有所了解,特别是第一个(这似乎是一个潜在的WPF错误)和后者(这似乎是一个Visual Studio错误)。任何形式的反馈或建议都会非常感激!

编辑:

我已将完整的解决方案(这是一个相当小的项目)作为ZIP file上传到我的服务器。您应该能够立即看到错误,并准备好进行测试。

2 个答案:

答案 0 :(得分:1)

在输出中报告一些这些Binding错误是相当常见的。它只是一个负载计时问题。要将噪声排除在输出之外,您可以关闭特定绑定的跟踪消息:

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

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

答案 1 :(得分:0)

我意识到这是一个旧帖子,但对于任何当前的观众,请尝试以下方法:

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

这会将X值设置为0.0,然后才能从ActualWidth读取值并删除错误。