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>
RectangleStyle
的 RenderTransform
设置器中的两个绑定是导致错误的原因,但我不确定如何解决该问题。有趣的是,图形正在被正确翻译,因此 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”错误的主要内容,如果未能解决你的问题,请参考以下文章