WPF 样式中的绑定导致莫名其妙的“找不到管理 FrameworkElement”错误

Posted

技术标签:

【中文标题】WPF 样式中的绑定导致莫名其妙的“找不到管理 FrameworkElement”错误【英文标题】:Binding in WPF style causes inexplicable "Cannot find governing FrameworkElement" error 【发布时间】:2011-03-12 01:07:27 【问题描述】:

我有一个ItemsControl,它显示了一堆矩形。每个矩形都需要向上和向左偏移。因此,我创建了一个RectangleStyle,它使用绑定来设置矩形的宽度、高度、X 平移和 Y 平移。

宽度和高度绑定工作正常,但TranslateTransform 绑定出现以下错误:

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=偏移量.X;数据项=空;目标元素是“TranslateTransform”(HashCode=16452547);目标属性是“X”(类型“双”)

这是我ItemControl的定义:

<ItemsControl
    Style="StaticResource ItemsControlStyle"
    ItemsSource="Binding Zones">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Style="StaticResource RectangleStyle" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这里是ItemsControlStyle的定义:

<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style>
                <Setter Property="Canvas.Left" Value="Binding Point.X" />
                <Setter Property="Canvas.Top" Value="Binding Point.Y" />
            </Style>
        </Setter.Value>
    </Setter>
</Style>

这里是RectangleStyle的定义:

<Style x:Key="RectangleStyle" TargetType="Rectangle">
    <Setter Property="Width" Value="Binding Size.Width" />
    <Setter Property="Height" Value="Binding Size.Height" />
    <Setter Property="RenderTransform">
        <Setter.Value>
            <!-- these bindings are causing the error -->
            <TranslateTransform X="Binding Offset.X" Y="Binding Offset.Y" />
        </Setter.Value>
    </Setter>
</Style>

RectangleStyleRenderTransform 设置器中的两个绑定是导致错误的原因,但我不确定如何解决该问题。有趣的是,图形正在被正确翻译,因此 WPF 能够解析绑定——出于某种原因,它对它们不满意。

我可以做些什么来修复绑定?


编辑

我在 MS Connect 上提交了错误报告:

https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window

【问题讨论】:

嗯,很容易复制。我尝试了大约 10 种不同的方法,但绑定工作正常,我想知道您是否应该在 MS Connect 上记录这个并让他们怀疑这是否是一个错误。 错误报告链接似乎已更改或不再公开。想知道这个问题的解决方案,因为添加 x:Name 对我没有任何作用。 【参考方案1】:

我也无法解释为什么会出现错误消息,但我发现在转换中添加 x:Name 属性是消除错误消息的一种方法:

<TranslateTransform x:Name="myTransform" X="Binding Offset.X" Y="Binding Offset.Y" /> 

【讨论】:

不错的解决方法;那些虚假的错误真的让我很烦。考虑到自最初发布以来已经有多少年了,我猜这被认为不值得修复。 @Bulli 你可以找到解决方案here 我在 ImageBrush 上遇到了同样的问题,给它一个名字来解决它。谢谢你:) 使用 .Net 3.5 并绑定到 ScaleTransform 时出现相同错误。添加 x:Name 似乎是一种解决方法。我无法验证绑定错误永远不会再发生。我还尝试使用 DebugConverter 来调试问题,但使用(或任何)转换器似乎与添加 x:Name 具有相同的效果。所以我无法调试任何东西,因为使用转换器时没有发生错误。 创建元素时 x:Name 会发生变化,因为它会检查它们是否唯一。我认为这些虚假错误是由于时间问题造成的,我猜想制作元素并因此尽早解决它的父级是它起作用的原因。【参考方案2】:

我想我找到了一些有用的信息。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683

这个问题的答案似乎在 Microsoft 对 ItemsControl 行为的解释中,因为 ItemsControl 经历了它的合成过程并应用了绑定和样式。也就是说,WPF 正在尝试优化您的 DataTemplate,然后才能成功评估绑定:“dataitem=null”。在其布局传递期间的所有其他实例中,“dataitem”指向您的“区域”IEnumerable 中的某些内容,并且它能够完成绑定。否则,您会看到集合中每个项目的错误,而不是每个属性一次。

这似乎是一种“不要注意幕后的人”类型的事情。它可能应该作为错误报告添加到 MS Connect;成功的代码不应该踢出无关紧要的“错误”。但是,如果您愿意,我会留给您将其提交给 MS Connect。

【讨论】:

+1,我同意,我刚刚在 MS Connect 上提交了一个错误:connect.microsoft.com/VisualStudio/feedback/details/746840/… 哇。他们花了大约五分钟的时间来决定“哇,哇,你猜对了,但我们不会解决这个问题。” 让我想知道 WPF 是否已经让位给 WinRT。 如果你问 WinDiv,我想你会得到一个与问 DevDiv 截然不同的答案。当然,Phone 的人也没有真正听过 WinDiv,DevDiv 也没有听 WP 的人……但就确定性而言,我认为只要 Visual Studio 基于 WPF,WPF 就具有持久力。 【参考方案3】:

阅读 Rob Perkins 的回答后,我将 FallbackValue 添加到与此问题的绑定中。这为我清除了错误。

【讨论】:

救了我的命,谢谢!但对我来说并不是这么简单——简单地在绑定中指定后备值对我来说不起作用——我必须将后备值创建为静态资源并在绑定中引用它。【参考方案4】:

如果这有助于其他人查看此问题,即使绑定似乎在运行时工作,输出窗口中的这个错误也困扰了我很长时间。经过大量研究,我发现可视化树中不存在转换,因此无法解析绑定。

要解决此问题,请将 Transform 移动为 Rectangle 的子元素,而不是资源字典中的子元素。

<Rectangle Style="StaticResource RectangleStyle">
    <Rectangle.RenderTransform>
        <TranslateTransform X="Binding Offset.X" Y="Binding Offset.Y" />
    </Rectangle.RenderTransform>
</Rectangle>

【讨论】:

以上是关于WPF 样式中的绑定导致莫名其妙的“找不到管理 FrameworkElement”错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 WPF 中的绑定动态设置资源样式

DataTemplate WPF 中样式设置器中的绑定

你能在数据绑定的 WPF 样式中做“数学”吗

在WPF中的Combobox中绑定

当 WPF 中的绑定为空时,如何避免 xaml 警告?

WPF 数据验证中的绑定失败