Как создать свойство зависимостей только для чтения? - PullRequest
60 голосов
/ 14 июля 2009

Как создать свойство зависимости только для чтения? Каковы лучшие практики для этого?

В частности, меня больше всего озадачивает тот факт, что нет никакой реализации

DependencyObject.GetValue()  

, который принимает System.Windows.DependencyPropertyKey в качестве параметра.

System.Windows.DependencyProperty.RegisterReadOnly возвращает объект D ependencyPropertyKey вместо DependencyProperty. Так как же вам получить доступ к свойству зависимостей только для чтения, если вы не можете делать какие-либо вызовы GetValue? Или вы должны каким-то образом преобразовать DependencyPropertyKey в простой старый DependencyProperty объект?

Советы и / или код будут с благодарностью!

1 Ответ

134 голосов
/ 14 июля 2009

На самом деле это просто (через RegisterReadOnly ):

public class OwnerClass : DependencyObject // or DependencyObject inheritor
{
    private static readonly DependencyPropertyKey ReadOnlyPropPropertyKey
        = DependencyProperty.RegisterReadOnly("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 это прозрачно для вас.

...