我有一个带有一个名为“ VerticalOffset”的DependencyProperty的自定义控件,它具有一个公共的getter和一个私有的setter。然后,我尝试将其绑定到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);
        }
    }


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


使用后面的代码,一切正常。

public override void OnApplyTemplate()
{
    PART_ScrollViewer = (ScrollViewer)GetTemplateChild("PART_ScrollViewer");
    this.SetBinding(VerticalOffsetProperty, new Binding("VerticalOffset") { Source = PART_ScrollViewer });
}

使用XAML,存在错误:


  无法设置属性“ VerticalOffset”,因为它没有可访问的设置器。


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



所以,这是问题所在:

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

最佳答案

毕竟,我尝试在定义类范围之外尝试SetBinding()和SetValue()方法以验证我的假设,即私有setter在代码级别上没有意义。结果表明,直接使用SetBinding()或SetValue更改了属性值()方法,无论其属性设置器是私有的还是公共的。

但是,如果我们使用私有设置器,则xaml中的任何值设置都是禁止的,这意味着我们不能使用VerticalOffset =“ 20”或VerticalOffset =“ {Binding Path}”语法。

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


  错误:没有授权密钥,无法修改只读VerticalOffsetProperty。


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


  错误:“ VerticalOffset”是只读的,无法绑定。


我想


  1.自定义了DependencyProperty以来,我们拥有使用SetValue()或SetBinding()方法在代码级进行修改的全部权利,并且Wrapper被忽略,因为它只是一个常用的精简接口,就像CLR属性一样因此,当我们使用私有设置器时,xaml将失败。
  
  2.也许.net的开发人员已经发现了这些潜在风险,所以他们使用一些验证方法来避免无效更改。

10-06 12:17