如何创建只读依赖项属性?

如何创建只读依赖属性? 有什么最佳实践可以做到这一点?

具体来说,最困扰我的是

DependencyObject.GetValue()

System.Windows.DependencyPropertyKey作为参数的。

System.Windows.DependencyProperty.RegisterReadOnly返回 DependencyPropertyKey对象而不是 DependencyProperty。那么,如果不能调用 GetValue,那么如何访问只读依赖属性呢?或者你应该以某种方式将 DependencyPropertyKey转换成一个简单的旧的 DependencyProperty对象?

建议和/或代码将非常感谢!

30884 次浏览

其实很简单(通过 RegisterReadOnly) :

public class OwnerClass : DependencyObject // or DependencyObject inheritor
{
private static readonly DependencyPropertyKey ReadOnlyPropPropertyKey
= DependencyProperty.RegisterReadOnly(
nameof(ReadOnlyProp),
typeof(int), typeof(OwnerClass),
new FrameworkPropertyMetadata(default(int),
FrameworkPropertyMetadataOptions.None));


public static readonly DependencyProperty ReadOnlyPropProperty
= ReadOnlyPropPropertyKey.DependencyProperty;


public int ReadOnlyProp
{
get { return (int)GetValue(ReadOnlyPropProperty); }
protected set { SetValue(ReadOnlyPropPropertyKey, value); }
}


//your other code here ...
}

只有在私有/受保护/内部代码中设置值时才使用该键。由于受保护的 ReadOnlyProp塞特,这是透明的给你。

我想指出的是,目前最好使用 https://github.com/HavenDV/DependencyPropertyGenerator,代码将非常简单:

[DependencyProperty<int>("ReadOnlyProperty", IsReadOnly = true)]
public partial class MyControl : UserControl
{
}