我有一个名为“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','cus它没有可访问的setter。
VerticalOffset="{Binding VerticalOffset,ElementName=PART_ScrollViewer}"
所以,问题在于:
答案 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的开发者发现了这些潜在的风险,所以他们使用一些验证方法来避免无效的更改。