SetBinding()和Property = {Binding Path}之间的区别

时间:2014-07-28 02:14:10

标签: c# wpf

我有一个名为“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);
        }
    }

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

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

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

      

    无法设置属性'VerticalOffset','cus它没有可访问的setter。

    VerticalOffset="{Binding VerticalOffset,ElementName=PART_ScrollViewer}"
    
  3. 所以,问题在于:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

  

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

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

  

错误:“VerticalOffset”是readonly,无法绑定。

我的假设

  

1.由于我们定义了DependencyProperty,我们通过使用SetValue()或SetBinding()方法在代码级别修改它来获得总权限,并忽略Wrapper'cus它只是一个常用的精简界面一个CLR属性。这就是为什么当我们使用私有的setter时,xaml会失败。

     

2.也许,.net的开发者发现了这些潜在的风险,所以他们使用一些验证方法来避免无效的更改。