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


71

如何创建只读依赖项属性?最佳做法是什么?

具体来说,最让我感到困扰的是,没有实施

DependencyObject.GetValue()  

以aSystem.Windows.DependencyPropertyKey作为参数。

System.Windows.DependencyProperty.RegisterReadOnly返回一个DependencyPropertyKey对象而不是一个对象DependencyProperty。因此,如果您无法对GetValue进行任何调用,应该如何访问只读依赖项属性?还是应该以某种方式将转换DependencyPropertyKey为普通的旧DependencyProperty对象?

建议和/或代码将不胜感激!

Answers:


148

实际上很简单(通过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设置器受保护,这对您是透明的。


1
您可以在此使用一个实时示例或要求(该只读属性)吗?
拉胡尔·索农

1
@RahulSonone每当您不希望从控件类外部设置属性时。如果你不让它只读,你可以将它设置在XAML等
乔希诺埃

2
任何控件的ActualWidth / ActualHeight就是一个很好的例子。
Flynn1179

4
您可能想要更新"ReadOnlyProp"到,nameof(ReadOnlyProp)因为很多人可能会复制/粘贴此内容,他们也可能会使用当前和改进的语法。
UuDdLrLrSs

1
没问题,谢谢你的建议。老实说,这是一个旧答案,我自己并不是在“维护”答案的更新版本。另外,这些天来,我在JavaScript上的使用比在C#上更多。
科南EK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.