繁体   English   中英

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

[英]Binding in WPF style causes inexplicable "Cannot find governing FrameworkElement" error

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

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

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Offset.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 setter 中的两个绑定是错误的原因,但我不确定如何解决该问题。 有趣的是,图形正确地转换,所以WPF能够解析绑定-它只是不开心他们出于某种原因。

我能做些什么来修复绑定?


编辑

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM