在WPF样式中绑定导致莫名其妙的 "无法找到管辖的FrameworkElement "错误

问题描述 投票:23回答:4

我有一个 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'. BindingExpression:Path=Offset.X; DataItem=null; 目标元素是'TranslateTransform'(HashCode=16452547); 目标属性是'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 是导致错误的原因,但我不知道该如何解决这个问题。有趣的是,图形 被正确翻译,所以WPF能够解决绑定问题--只是由于某些原因对它们不满意。

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


编辑

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

https:/connect.microsoft.comVisualStudiofeedbackdetails746840misleading-cannot-find-governing-frameworkelement-error-messag-appear-in-output-window。

wpf data-binding xaml binding
4个回答
51
投票

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

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

10
投票

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

http:/social.msdn.microsoft.comForumsen-USwpfthreaddb050ce6-d084-41ad-9a31-c01831687683。

答案似乎在微软对行为的解释中,因为一个ItemsControl会经历它的合成过程并应用绑定和样式。也就是说,WPF在拥有一个数据源以成功评估绑定之前,就试图优化你的DataTemplate。"dataitem=null". 在它的布局传递过程中,每隔一个实例,"dataitem "都会指向你的 "Zones "IEnumerable中的某个东西,它就能完成绑定。否则,你会看到你的集合中的每个项目都会出现错误,而不是每个属性只出现一次。

这似乎是一种 "不注意幕后黑手 "的类型。而且它可能应该作为一个错误报告添加到MS Connect中;成功的代码不应该踢出 "错误",这并不重要。但如果你想的话,我会让你把这个问题提交给MS Connect。


2
投票

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


0
投票

如果这能帮助其他关注这个问题的人,即使绑定在运行时出现工作,输出窗口中的这个错误也困扰了我很久。经过大量研究,我发现视觉树中不存在Transform,因此无法解决绑定问题。

要解决这个问题,请将Transform移到你的Rectangle的子节点,而不是在你的资源字典中。

<Rectangle Style="{StaticResource RectangleStyle}">
    <Rectangle.RenderTransform>
        <TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
    </Rectangle.RenderTransform>
</Rectangle>
© www.soinside.com 2019 - 2024. All rights reserved.