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

10-10 11:21