为什么绑定到转换工作呢?

时间:2018-04-02 21:21:41

标签: c# wpf data-binding

我正在使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

那是因为ScaleTransform(以及其他变换)继承自FreezableFreezable以特殊方式处理有关继承数据上下文的问题。当依赖项对象的依赖项属性设置为某个值,并且该值可以冻结(而不是冻结)时,它将继承来自&#34; parent&#34;对象,即使freezable本身可能根本不是树的一部分。

在这种情况下,&#34;父母&#34;依赖项对象是Rectangle(树的一部分),目标依赖项属性是RenderTransform,设置的值是ScaleTransform。因为它符合上述标准(例如可冻结) - ScaleTransform从其父母&#34;继承数据上下文。 (不是在树的意义上) - Rectangle。所以所有绑定都能正常工作。为什么WPF设计师不能认识到这是另一个故事,有很多事情是无法识别的。

如果您从Freezable继承自己的类 - 它的行为方式会相同,通常可能会有用。