Wie erstellen Sie eine schreibgeschützte Abhängigkeitseigenschaft?

71

Wie erstellen Sie eine schreibgeschützte Abhängigkeitseigenschaft? Was sind die Best Practices dafür?

Was mich am meisten überrascht, ist die Tatsache, dass es keine Implementierung von gibt

DependencyObject.GetValue()  

das nimmt a System.Windows.DependencyPropertyKeyals Parameter.

System.Windows.DependencyProperty.RegisterReadOnlyGibt ein D- ependencyPropertyKeyObjekt anstelle von a zurück DependencyProperty. Wie sollen Sie also auf Ihre schreibgeschützte Abhängigkeitseigenschaft zugreifen, wenn Sie GetValue nicht aufrufen können? Oder solltest du das irgendwie DependencyPropertyKeyin ein einfaches altes DependencyPropertyObjekt umwandeln ?

Beratung und / oder Code wäre sehr dankbar!

Giffyguy
quelle

Antworten:

148

Eigentlich ist es einfach (über 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 ...
}

Sie verwenden den Schlüssel nur, wenn Sie den Wert in privatem / geschütztem / internem Code festlegen. Aufgrund des geschützten ReadOnlyPropSetzers ist dies für Sie transparent.

Kenan EK
quelle
1
Können Sie ein Echtzeitbeispiel oder eine Anforderung, bei der wir diese ReadOnly-Abhängigkeitseigenschaft verwenden, angeben?
Rahul Sonone
1
@RahulSonone immer dann, wenn Sie nicht möchten, dass die Eigenschaft von außerhalb der Steuerungsklasse festgelegt wird. Wenn Sie es nicht schreibgeschützt machen, können Sie es in XAML usw. einstellen.
Josh Noe
2
ActualWidth / ActualHeight eines Steuerelements sind ein gutes Beispiel.
Flynn1179
4
Möglicherweise möchten Sie ein Update durchführen "ReadOnlyProp", nameof(ReadOnlyProp)da viele Benutzer dies wahrscheinlich kopieren / einfügen und die aktuelle und verbesserte Syntax verwenden können.
UuDdLrLrSs
1
Kein Problem, danke für den Vorschlag. Um ehrlich zu sein, ist dies eine alte Antwort und ich "pflege" nicht selbst aktualisierte Versionen von Antworten. Außerdem beschäftige ich mich heutzutage viel mehr mit Javascript als mit C #.
Kenan EK