34

我有一个项目抛出一些数据绑定错误。一个例子是:

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. 所以现在要解决这个问题,我只是手动设置了HorizontalContentAlignmenton all MenuItems。错误的原因在某种程度上与操作顺序有关,因为这MenuItem是在代码中生成的。我将单独发布一个新问题。

所以,就目前而言,这个故事的寓意是,我觉得需要一个更好的机制来确定错误绑定的声明位置。我想看到类似绑定堆栈跟踪的东西..

如果有人知道确定在代码或标记中声明绑定的位置的任何其他工具或方法,我将把这个问题保持一段时间。

我发布了另一个关于应用于MenuItemshere的样式/绑定的问题。

4

4 回答 4

105

在调试 WPF 绑定错误时,我发现用分号将错误分解最容易,并从最后开始

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

所以从头开始:

  • #5 告诉您哪个属性包含失败的绑定。在你的情况下,它是HorizontalContentAlignment

  • #4 是包含失败属性的元素,它MenuItem没有Name属性来识别它

    所以在某个地方你有一个<MenuItem HorizontalContentAlignment="{Binding ...}" />导致绑定错误的地方。

  • #3 是目标元素后面的DataItem, 或, 。DataContext它似乎null适合您,但这不是问题,因为看起来您的绑定没有引用 DataContext。

    但这确实表明MenuItem不是您的常规的一部分VisualTree,因为通常DataContext是从父对象继承的。

  • #2 包含实际绑定错误和有关绑定的信息。它实际上可以进一步分解为多个部分。

    • Cannot find source for binding

    • with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''.

    • BindingExpression:Path=HorizontalContentAlignment;

    “找不到源”意味着绑定找不到要绑定的源对象,在您的情况下,该源对象应该是{RelativeSource AncestorType={x:Type ItemsControl}FindAncestor并且AncestorLevel=1是 a 的默认值RelativeSource,所以我忽略了那些)

    #2的最后一部分显示Path您尝试绑定到:HorizontalContentAlignment

所以把它们放在一起,在你的代码的某个地方有一个<MenuItem>试图将它绑定HorizontalContentAlignment到一个ItemsControl.HorizontalContentAlignment,但绑定找不到ItemsControl.

您正在使用RelativeSource FindAncestor绑定来查找ItemsControl,它向上搜索可视化树以找到最接近ItemsControl的 ,但它没有找到一个,因此在 VisualTree 层次结构中必须没有ItemsControl更高的MenuItem.

我经常看到这个问题,ContextMenus因为它们VisualTree与其他 XAML 代码不同。VisualTree(要引用a附加到的 main 中的对象ContextMenu,您可以使用该PlacementTarget属性,例如此示例

了解绑定错误后,通常很容易在 XAML 中找到它的来源。

根据我的应用程序大小,我通常会执行以下操作之一:

  • 从绑定错误(在您的情况下为 )中搜索“目标元素”的应用程序MenuItem,并查看其中是否有任何HorizontalContentAlignment使用绑定设置“目标属性”( )

  • 从绑定错误 ( ) 中搜索“目标属性”的应用程序HorizontalContentAlignment以找到导致此问题的绑定

  • 从绑定错误中显示的绑定文本中搜索应用程序以查找相当独特的内容。在您的情况下,您可以尝试搜索{x:Type ItemsControl}哪个将成为您的RelativeSource绑定的一部分,并且这样的短语不应该有太多的搜索结果。

  • 使用SnoopWPF Inspector等第 3 方工具在运行时跟踪绑定错误。

    我以前只使用过 Snoop,但要使用它,您需要启动您的应用程序并针对它运行 Snoop 以在应用程序运行时检查您的应用程序的 VisualTree。然后,您可以通过在搜索栏中键入“MenuItem”之类的内容来搜索 VisualTree 以过滤所有的 Visual Tree MenuItems,然后查看它们的属性以找出哪个有绑定错误(该HorizontalContentAlignment属性将以红色突出显示,因为绑定错误)。

    应该注意的是,如果你MenuItem在 a 内ContextMenu,那么你需要打开它ContextMenu才能绘制 MenuItems 并显示在 Snoop 中。

于 2013-01-25T14:00:58.080 回答
4

也许您可以使用这个名为Snoop的出色应用程序。它在CodePlex中是免费的。它帮助我找到了几个绑定问题,以及丢失的数据上下文。它让您探索整个 WPF 可视化树,并为您提供绑定错误。

希望史努比能帮上忙。

于 2013-01-24T23:38:07.607 回答
1

我是 WPF 的新手,我有完全相同的错误。虽然我现在已经修复了它,但我真的不知道如何......以下是我尝试过的步骤:

首先,我有:

  1. 一个<Menu>
  2. 2<ContextMenu>定义在<ListBox.ItemTemplate>

我试图:

  1. 将一个<ContextMenu>移入<ListBox.ItemContainerStyle> -> 存在错误
  2. 设置和删除样式HorizontalContentAlignmentVerticalContentAlignmentfor <Menu>, <ContextMenu>, <MenuItem> ->error 存在
  3. 设置in的Name属性 ->没有错误!<MenuItem><ContextMenu><ListBox.ItemTemplate>
  4. 删除Name属性->仍然没有错误...
  5. 重新启动VS - >错误似乎永远消失了......

最终,我有

  1. 一个<Menu>
  2. 一个<ContextMenu>定义在<ListBox.ItemTemplate>
  3. 一个<ContextMenu>定义在<ListBox.ItemContainerStyle>

并且他们都没有设置样式HorizontalContentAlignmentVerticalContentAlignment。并且错误消失了...

似乎有一些刷新问题。因此,对于那些有同样问题的人,您可以尝试重新启动 VS 或设置Name属性<MenuItem>...

于 2017-08-23T07:15:00.060 回答
0

System.Windows.Data 错误:4 - 这不是您的问题,这是 WPF 已知问题。它是相关的组合框/菜单,其项目是动态更改的。看到这个。顺便说一句,您可以忽略此错误,通常应用程序可以正常工作。

于 2017-03-27T19:56:33.157 回答