gpt4 book ai didi

c# - SetBinding() 和 Property={Binding Path} 的区别

转载 作者:行者123 更新时间:2023-11-30 12:59:35 25 4
gpt4 key购买 nike

我有一个自定义控件,它有一个名为“VerticalOffset”的 DependencyProperty,它有一个公共(public) getter 和一个私有(private) setter。然后我尝试将它绑定(bind)到作为其模板一部分的 ScrollViewer.VerticalOffset。

    public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.Register("VerticalOffset", typeof(double), typeof(MyControl));

public double HorizontalOffset
{
get { return (double)GetValue(HorizontalOffsetProperty); }
private set
{
SetValue(HorizontalOffsetProperty, value);
}
}

我已经尝试了两种解决方案,但事情变得很奇怪。

  1. 使用代码隐藏,一切正常。

    public override void OnApplyTemplate()
    {
    PART_ScrollViewer = (ScrollViewer)GetTemplateChild("PART_ScrollViewer");
    this.SetBinding(VerticalOffsetProperty, new Binding("VerticalOffset") { Source = PART_ScrollViewer });
    }
  2. 使用XAML,出现错误:

    Cannot set property 'VerticalOffset','cus it has no accessible setter.

    VerticalOffset="{Binding VerticalOffset,ElementName=PART_ScrollViewer}"

问题来了:

这两种解决方案有什么区别,为什么第二种解决方案不起作用?

最佳答案

毕竟,我在定义类范围之外尝试了 SetBinding() 和 SetValue() 方法来验证我的假设,即私有(private) setter 在代码级别没有意义。结果显示属性值是通过直接使用 SetBinding( ) 或 SetValue() 方法,无论其 Property setter 是私有(private)的还是公共(public)的。

但是,如果我们使用私有(private) setter ,则禁止在 xaml 中设置任何值,这意味着我们不能使用 VerticalOffset="20"或 VerticalOffset="{Binding Path}"语法。

此外,我还尝试了那些 WPF 核心只读属性,例如 ScrollViewer.VerticalOffseProperty,结果非常有趣。当我尝试 SetValue() 时,它告诉我

Error: The readonly VerticalOffsetProperty cannot be modified without an authorization key.

然后 SetBinding() 方法返回另一个结果

Error: "VerticalOffset" is readonly which cannot be bound.

我的假设

1.Since we define a DependencyProperty,we have the total rights by using SetValue() or SetBinding() method to modify it in code level and the Wrapper is ignored 'cus it is only a lite interface for common use just like a CLR property.So that's why when we use a private setter,the xaml will fail.

2.Maybe,the developer of .net have found these potential risks,so they use some validating methods to avoid invalid changes.

关于c# - SetBinding() 和 Property={Binding Path} 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24987634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com