代码之家  ›  专栏  ›  技术社区  ›  oliver

为什么绑定到转换工作?

  •  2
  • oliver  · 技术社区  · 8 年前

    我正在使用DataTemplate向ItemsControl添加矩形。矩形在指定为ItemsControl的ItemsSource的ObservableCollection中指定。矩形模型指定平移、旋转和缩放。

    我不明白的是:当transform或TransformGroup不是框架元素,因此不支持继承DataContext时,为什么我可以将某些东西绑定到转换?

    XAML编译器甚至会给我错误:

    (System.Windows.Data错误:2:找不到管理FrameworkElement 或目标的FrameworkContentElement 要素BindingExpression:路径=比例;DataItem=空;目标元素为 “ScaleTransform”(哈希代码=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 回复  |  直到 8 年前
        1
  •  1
  •   Evk    8 年前

    那是因为 ScaleTransform (和其他变换)继承自 Freezable 可冻结 对于继承数据上下文,以特殊的方式处理。当dependency对象的dependency属性设置为某个值,并且该值是可释放的(而不是冻结的)时,它将从“父”对象继承数据上下文,即使可释放本身可能根本不是树的一部分。

    在这种情况下,“父”依赖项对象是 Rectangle (树的一部分),目标依赖项属性为 RenderTransform 设置的值为 缩放变换 。因为它符合上述条件(例如可自由释放)- 缩放变换 从“父”继承数据上下文(不是树意义上的)- 长方形 。因此,所有绑定都正常工作。为什么WPF设计师没有认识到这是另一个故事,有很多事情它无法认识到。

    如果您继承自己的类 可冻结 -它将以同样的方式运行,这通常可能是有用的。