【发布时间】:2013-01-08 18:35:56
【问题描述】:
我有一个项目引发了一些数据绑定错误。一个例子是:
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')
我的问题是是否有办法确定此绑定的实际声明位置(在 XAML 或代码中声明)。
到目前为止我已经尝试过:
- 为 System.Windows.Data 命名空间添加了调试跟踪,级别设置为全部;这并没有产生任何更有用的信息
- 尝试在项目中对单词Binding 进行文本搜索,希望能找到所有将Path 设置为
HorizontalContentAlignment的绑定表达式;我只找到了一个并将其删除,但我仍然收到消息,这似乎表明那不是有故障的..
您是否知道任何其他技巧可以让 WPF 吐出一些更有用的信息,说明此绑定的确切声明位置?
更新
经过更多搜索后,我很确定这是由于某种样式应用于MenuItem 造成的。但是,我仍然无法确定错误绑定被声明的位置..
更新 2
我发现了问题。但是问题仍然存在,因为发现问题主要是根据错误消息中的有限信息在黑暗中搜索的问题。
事实证明,绑定是在样式中声明的。而且样式不在我的应用程序中。这可能是MenuItem 的默认样式。所以现在要解决这个问题,我只是在所有MenuItems 上手动设置HorizontalContentAlignment。错误的原因在某种程度上与操作顺序有关,因为这个MenuItem 是在代码中生成的。我将单独发布一个新问题。
所以,就目前而言,这个故事的寓意是,我觉得需要一种更好的机制来确定错误绑定的声明位置。我希望看到类似绑定的堆栈跟踪。
如果有人知道任何其他工具或方法可以确定在代码或标记中声明绑定的位置,我将把这个问题保持一段时间。
我已经发布了另一个question regarding the style/binding being applied to the MenuItems here。
【问题讨论】:
-
Hrrm 我最近写了一个关于绑定错误的答案here。错误告诉您它正在尝试绑定
<MenuItem HorizontalContentAlignment={ItemsControl.HorizontalContentAlignment}">,但 WPF 无法找到ItemsControl(“找不到绑定源”)。这可能是因为ContextMenus are not part of the same VisualTree as the rest of the application,所以你需要在你的绑定中使用PlacementTarget来访问ContextMenu所附加的对象。 -
当异常发生时您是否尝试捕获异常?从 Debug 菜单中,选择 Exceptions... 并深入到您遇到的异常,然后选中“Thrown”框。不确定它是否会有所帮助,但还有一件事要尝试。
-
但要回答您发布的实际问题,我喜欢使用Snoop 来调试 WPF 绑定错误。它将让您轻松浏览 VisualTree,并向您显示任何绑定问题
-
@Rachel - 感谢您提供的信息。我会看看你的帖子。我也会和 Snoop 一起尝试一下,看看我是否可以通过这种方式对此事有所了解。否则,问题是我在代码或 XAML 中没有绑定 HorizontalContentAlignment 的位置..奇怪..
-
任何想法如何使用 Snoop 来确定 BindingErrors 可能发生的位置?我尝试了“仅显示具有绑定错误的视觉效果”,但什么也没找到..
标签: wpf data-binding