【问题标题】:Why does binding to a transform work at all?为什么绑定到转换工作?
【发布时间】:2018-04-02 21:21:41
【问题描述】:

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

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

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

(System.Windows.Data 错误:2:找不到管理 FrameworkElement 或 FrameworkContentElement 为目标 元素。绑定表达式:路径=比例;数据项=空;目标元素是 'ScaleTransform' (HashCode=35912612);目标属性是“ScaleX” (输入“双”))

但是项目的显示工作正常。这很奇怪,不是吗。

    <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;
    }
}

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

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

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

    如果您从 Freezable 继承您自己的类 - 它将以相同的方式运行,这通常可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2011-08-18
      • 2021-05-22
      • 2014-02-02
      • 2017-02-07
      相关资源
      最近更新 更多