我有一个 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上提交了一个错误报告。
我也无法解释为什么会发生错误信息,但我发现在变换中添加一个x:Name属性是一种摆脱错误信息的方法。
<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
我想我找到了一些有用的信息
http:/social.msdn.microsoft.comForumsen-USwpfthreaddb050ce6-d084-41ad-9a31-c01831687683。
答案似乎在微软对行为的解释中,因为一个ItemsControl会经历它的合成过程并应用绑定和样式。也就是说,WPF在拥有一个数据源以成功评估绑定之前,就试图优化你的DataTemplate。"dataitem=null". 在它的布局传递过程中,每隔一个实例,"dataitem "都会指向你的 "Zones "IEnumerable中的某个东西,它就能完成绑定。否则,你会看到你的集合中的每个项目都会出现错误,而不是每个属性只出现一次。
这似乎是一种 "不注意幕后黑手 "的类型。而且它可能应该作为一个错误报告添加到MS Connect中;成功的代码不应该踢出 "错误",这并不重要。但如果你想的话,我会让你把这个问题提交给MS Connect。
在阅读了Rob Perkins的答案后,我为这个问题的绑定添加了一个FallbackValue。 这为我清除了错误。
如果这能帮助其他关注这个问题的人,即使绑定在运行时出现工作,输出窗口中的这个错误也困扰了我很久。经过大量研究,我发现视觉树中不存在Transform,因此无法解决绑定问题。
要解决这个问题,请将Transform移到你的Rectangle的子节点,而不是在你的资源字典中。
<Rectangle Style="{StaticResource RectangleStyle}">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
</Rectangle.RenderTransform>
</Rectangle>