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