c# - 为什么绑定(bind)到转换完全有效?

标签 c# wpf data-binding

我正在使用 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(和其他转换)继承自 FreezableFreezable 以一种关于继承数据上下文的特殊方式处理。当依赖对象的依赖属性设置为某个值时,该值是可卡住的(而不是卡住的)——它将从“父”对象继承数据上下文,即使可卡住本身可能根本不是树的一部分。

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

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

关于c# - 为什么绑定(bind)到转换完全有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618999/

相关文章:

特定列上的 C# ListView LabelEdit

c# - 在WCF数据服务中获取请求的应用程序名称

c# - WPF - ListView 内的 ListView 滚动条问题

wpf - 在 WPF 中使用 FindName() 找不到动态生成的控件

WPF 通用 DataGrid CellTemplate - 绑定(bind)到单元格值?

C# - 尝试将字典转换为 JSON

c# - 以 WebBrowser 窗体(Windows 窗体 C#)完全加载页面时的 DocumentCompleted 事件

c# - 通过WCF服务上传超过50KB的文件失败

forms - 在命名表单上使用 ng-model 时获取 [Object object]

.net - WinForms:对象数据源使用最佳实践