我正在使用DataTemplate将矩形添加到ItemsControl。矩形在ObservableCollection中指定,该ObservableCollection被指定为ItemsControl的ItemsSource。矩形模型指定平移,旋转和缩放。
我不明白的是:当Transform或TransformGroup不是FrameworkElements并因此不支持继承DataContext时,为什么可以将某些内容绑定到转换?
XAML编译器甚至给我错误:
(System.Windows.Data错误:2:找不到管理FrameworkElement
或FrameworkContentElement作为目标
元件。 BindingExpression:Path = Scale; 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;
}
}
最佳答案
这是因为ScaleTransform
(和其他转换)是从Freezable
继承的。 Freezable
以关于继承数据上下文的特殊方式处理。当依赖项对象的依赖项属性设置为某个值,并且该值是可冻结的(而不是冻结的)时,即使Freezable本身可能根本不是树的一部分,它也会从“父”对象继承数据上下文。
在这种情况下,“父”依赖项对象是Rectangle
(树的一部分),目标依赖项属性是RenderTransform
,设置的值是ScaleTransform
。因为它符合上述条件(例如可冻结),所以ScaleTransform
从其“父级”(不是树状结构)-Rectangle
继承数据上下文。因此,所有绑定都可以正常工作。为什么WPF设计师无法识别那是另一回事,但很多事情还是无法识别。
如果您从Freezable
继承自己的类-它将以相同的方式运行,这通常可能很有用。
关于c# - 为什么绑定(bind)到转换完全起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49618999/