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

时间:2010-07-05 20:08:21

标签: wpf data-binding xaml binding

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

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

  

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= Offset.X;的DataItem = NULL; target元素是'TranslateTransform'(HashCode = 16452547); target属性为'X'(类型'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>

RenderTransform RectangleStyle setter中的两个绑定是导致错误的原因,但我不知道如何解决问题。有趣的是,图形正在正确翻译,因此WPF能够解析绑定 - 由于某种原因,它只是对它们不满意。

我该怎么做才能修复绑定?


修改

我提交了有关MS Connect的错误报告:

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

4 个答案:

答案 0 :(得分:49)

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

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

答案 1 :(得分:9)

我想我发现了一些有用的信息。

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

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

它似乎是一个“不关注窗帘背后的男人”类型的东西。它应该作为错误报告添加到MS Connect中;成功的代码不应该踢出“无关紧要的错误”。但是如果你愿意,我会留给你用MS Connect提交。

答案 2 :(得分:1)

在阅读Rob Perkins的回答后,我在这个问题的绑定中添加了一个FallbackValue。这清除了我的错误。

答案 3 :(得分:0)

如果这可以帮助其他任何人查看此问题,即使绑定似乎在运行时也起作用,则“输出”窗口中的此错误会困扰我很久。经过大量研究,我发现视觉树中不存在转换,因此无法解析绑定。

要解决此问题,请将Transform移为Rectangle的子级,而不要移至资源字典中。

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