我正在使用DataTemplate将Rectangle添加到ItemsControl。矩形在ObservableCollection中指定,该ObservableCollection被指定为ItemsControl的ItemsSource。矩形模型指定平移,旋转和缩放。
我不明白:当Transform或TransformGroup不是FrameworkElements并且因此不支持继承DataContext时,为什么我可以将某些内容绑定到转换?
XAML编译器甚至给我错误:
(System.Windows.Data错误:2:找不到管理FrameworkElement 或Target的FrameworkContentElement 元件。 BindingExpression:路径=量表;的DataItem = NULL;目标元素是 'ScaleTransform'(HashCode = 35912612);目标属性是'ScaleX' (输入'Double'))
但是项目的显示工作正常。这很奇怪,不是吗。
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="100" Height="100" Fill="Red">
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform
ScaleX="{Binding Scale}"
ScaleY="{Binding Scale}" />
<RotateTransform
Angle="{Binding Angle}" />
<TranslateTransform
X="{Binding X}"
Y="{Binding Y}" />
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
型号:
public class RectangleModel
{
public double X {get; private set;}
public double Y {get; private set;}
public double Scale {get; private set;}
public double Angle {get; private set;}
public RectangleModel(double x, double y, double scale, double angle)
{
X = x;
Y = y;
Scale = scale;
Angle = angle;
}
}
答案 0 :(得分:1)
那是因为ScaleTransform
(以及其他变换)继承自Freezable
。 Freezable
以特殊方式处理有关继承数据上下文的问题。当依赖项对象的依赖项属性设置为某个值,并且该值可以冻结(而不是冻结)时,它将继承来自&#34; parent&#34;对象,即使freezable本身可能根本不是树的一部分。
在这种情况下,&#34;父母&#34;依赖项对象是Rectangle
(树的一部分),目标依赖项属性是RenderTransform
,设置的值是ScaleTransform
。因为它符合上述标准(例如可冻结) - ScaleTransform
从其父母&#34;继承数据上下文。 (不是在树的意义上) - Rectangle
。所以所有绑定都能正常工作。为什么WPF设计师不能认识到这是另一个故事,有很多事情是无法识别的。
如果您从Freezable
继承自己的类 - 它的行为方式会相同,通常可能会有用。