WPF样式中的绑定导致出现莫名其妙的“找不到控制 FrameworkElement”的错误。

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

宽度和高度的绑定正常工作,但对于TranslateTransform的绑定,我收到以下错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Offset.X; DataItem=null; target element is 'TranslateTransform' (HashCode=16452547); target property is 'X' (type 'Double')

这是我的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>

< p > 在 < code > RectangleStyle 的 < code > RenderTransform setter 中的两个绑定是错误的原因,但我不确定该怎么做才能解决问题。有趣的是,图形确实被正确地转换了,所以WPF能够解析这些绑定--只是出于某种原因它对它们不满意。 < p > 我该怎么办才能修复这些绑定?

编辑

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

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


好的,复制很容易。我尝试了大约10种不同的方法,但是由于绑定工作正常,我想你应该在MS Connect上记录这个问题,让他们想知道是否有bug。 - Rob Perkins
看起来错误报告链接已更改或不再公开。由于添加x:Name对我没有任何作用,因此想知道这个问题的解决方案。 - Berin Loritsch
4个回答

58

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

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

1
不错的解决方法;那些虚假错误真的让我很烦恼。考虑到原帖已经发布多年,我猜想这个问题被认为不值得修复了。 - Dan Bryant
1
@Bulli,你可以在这里找到解决方案:https://dev59.com/C1DTa4cB1Zd3GeqPN_0N - ghord
6
我也遇到了ImageBrush的同样问题,给它命名后问题解决了。谢谢 :) - adminSoftDK
1
使用 .Net 3.5 绑定 ScaleTransform 时遇到了相同的错误。添加 x:Name 看起来是一种解决方法。我无法验证绑定错误是否会再次发生。我还尝试使用 DebugConverter 调试问题,但使用转换器(或者可能是任何转换器)似乎具有与添加 x:Name 相同的效果。因此,我无法调试任何东西,因为在使用转换器时错误没有发生。 - MrToast
1
x:Name 会在元素创建时改变,因为它检查它们是否唯一。我认为这些错误是由于时间问题造成的,我猜让元素及其父级尽早解析可能是它能正常工作的原因。 - Andy
显示剩余3条评论

10

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

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

解决方法似乎出现在Microsoft关于ItemsControl进行合成过程并应用绑定和样式时的解释中。也就是说,在WPF尝试优化您的DataTemplate之前,它尚未成功评估绑定的数据源:"dataitem=null"。在布局过程的每个其他实例中,“dataitem”指向“Zones” IEnumerable中的某些内容,并且能够完成绑定。否则,您会看到集合中每个项目都会出现该错误,而不仅仅是属性的每个实例。

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


1
+1,我同意,并且我刚刚在MS Connect上提交了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window - devuxer
3
哇,他们花了大约五分钟的时间才决定“哇哦,没错,但我们不会解决这个问题。” - Rob Perkins
1
让我开始思考WPF是否已经被WinRT所取代。 - devuxer
1
如果你问WinDiv,我想你会得到一个非常不同的答案,而如果你问DevDiv,也是如此。当然,手机部门也并没有真正听取WinDiv的意见,而DevDiv也没有听取WP人员的意见...但就确定性而言,我认为只要Visual Studio基于WPF,它就具有持久力。 - Rob Perkins

3

在阅读了Rob Perkins的答案后,我在绑定中添加了FallbackValue以解决此问题。这样就为我清除了错误。


拯救了我的生命,谢谢!但对我来说并不是这么简单 - 在绑定中仅指定回退值对我无效 - 我必须将回退值创建为静态资源并在绑定中引用它。 - G. B.

0
如果这篇文章能帮助到其他遇到同样问题的人,那就太好了。虽然绑定在运行时似乎是有效的,但是输出窗口中的错误信息却让我困扰了很长时间。经过大量研究,我发现变换不在可视树中,因此无法解析绑定。
为了解决这个问题,将变换移动到矩形的子元素中,而不是放在资源字典中即可。
<Rectangle Style="{StaticResource RectangleStyle}">
    <Rectangle.RenderTransform>
        <TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
    </Rectangle.RenderTransform>
</Rectangle>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接