Frage

muss ich wissen, was das Verfahren ist eine Zuschreibung nur abhängigkeits Eigenschaft zu machen. Ich kann sehen, dass die DependencyProperty-Klasse nicht über eine spezielle „Register“ Methode für write-only-Eigenschaften, aber ich habe keine Ahnung, ob die Registerattached Methode anwenden kann, was ich zu tun versuchen.

Diese Eigenschaft muss eine Abhängigkeits-Eigenschaft sein, anstatt eine einfache CLR-Eigenschaft. Intern erfordert meine Klasse eine PropertyChangedCallback über diese Eigenschaft, um stabil zu bleiben.

Ich weiß, dass Schreib nur abhängigkeits Eigenschaften erzeugt werden können, weil es recht angegeben ist eindeutig in:
Pro C # 2008 und .NET 3.5-Plattform , Seite 1061 .
Dies ist jedoch der einzige Ort, wo ich kann sogar „Abhängigkeitseigenschaft“ und „write only“ auf der gleichen Seite. Und dieser Autor offenbar nicht glaubte, es war notwendig, um tatsächlich für den Leser das Verfahren zu zeigen, etwas anderes als eine grundlegende Schreib-Lese-Abhängigkeitseigenschaft. Natürlich ist dieses Buch könnte eine Last von BS - aber dieses Buch ziemlich Standard sieht, so denke ich, es ist eine ziemlich sichere Wette, dass der Autor richtig ist. Ich gehe davon aus das Fehlen von Informationen über das Internet auf die Tatsache zurückzuführen, dass sich niemand im Allgemeinen eine Eigenschaft wie diese machen muss.

Ich weiß, dass es sehr fraglich klingt zu wollen, um Ihre eigene Schreib nur abhängigkeits Eigenschaft machen. Ich versichere Ihnen, es macht Sinn, wo ich es will. Meine Klasse hat eine Eigenschaft, deren Wert auf das Objekt nur dann sinnvoll einstellen es. Wenn ein anderes Objekt später den Wertes dieser Immobilie Anfrage, wäre es nicht in der Lage sein, jeden rationalen Sinn aus dem Wert zu machen, ohne den ursprünglichen Kontext des Setter zu kennen.

Diese Eigenschaft ist nicht beabsichtigt, zu Informationszwecken verwendet werden. Lassen außerhalb Objekte versuchen, den Eigenschaftswert zu verwenden, so problematisch ist, gefährlich, und ein Sicherheitsrisiko. Also ich glaube, das beste Design Leseoperationen auf dieser Eigenschaft zu verbieten ist. Jeder meiner Klasse verwendet, wird feststellen, dass sie die Klasse, wie es beabsichtigt zu verwenden sind gezwungen wurde, die viel besser funktioniert und sauberer am Ende.

War es hilfreich?

Lösung

Sie können nicht, erscheint dies durch Design zu sein. Während ich die Qualität Ihrer Herangehensweise an das erwähnte Buch und bin in keiner Weise in Frage verstehen, würde ich immer noch diese vermuten eine Art Copy & Paste oder ähnlichen Problem zu sein. Hier ist meine Argumentation:

WPF-Eigenschaftensystem-Code

WPF-Eigenschaftensystem Design

  • Noch wichtiger ist, "Die aktuelle WPF Implementierung seines XAML-Prozessors ist von Natur aus Abhängigkeitseigenschaft bewusst. Der WPF XAML-Prozessor verwendet Eigenschaftensystem Methoden zur Abhängigkeitseigenschaften, wenn binäre XAML und Verarbeitungsattribute laden, die Abhängigkeitseigenschaften sind. Dies umgeht effektiv die Eigenschaft Wrapper. " finden Sie unter XAML Laden und Abhängigkeit Eigenschaften .
  • Am wichtigsten ist, "Abhängigkeitseigenschaften im Allgemeinen in Betracht gezogen werden sollte öffentliche Eigenschaften sein. Die Art der Windows Presentation Foundation (WPF) Eigenschaftensystem verhindert, dass die Fähigkeit, Sicherheitsgarantien über eine Abhängigkeitseigenschaftswert zu machen. " finden Sie unter Abhängigkeitseigenschaft Sicherheit .

Vor allem die letzten beiden Punkte, die die Konstruktionsbedingung sind umreißt, sind, dass die Abhängigkeitseigenschaftswerte immer erreichbar über GetValue () / SetValue () , egal ob ihr CLR-Wrapper Zugriff eingeschränkt oder überhaupt zur Verfügung, mit der einzigen Ausnahme, die speziell entfielen Read-Only Abhängigkeitseigenschaften .

Folglich wird, wie Jeffs Antwort impliziert bereits, nur den Getter zum Beispiel das Entfernen nicht wirklich verhindern, dass jemand das Eigentum über GetValue () , obwohl dies kann zumindest 'reduziert den unmittelbar ausgesetzten Namensraum einer benutzerdefinierte Klasse' . Die Nützlichkeit einer solchen semantischen Problemumgehung die prope machenrty Wert etwas weniger sichtbar / zugänglich und der abgerufenen Wert von Natur nutzlos für Kunden wie Jeff hängt von Ihrem speziellen Szenario natürlich.

Andere Tipps

Interessant, das ist definitiv ein seltenes Szenario, würde ich interessiert sein, um zu hören, was es ermöglicht.

Möchten Sie die Idee der Bereitstellung eines ungültigen Wert (zB null) betrachten für liest durch Bindung oder GetValue, während gerade kein CLR Getter mit?

So oder eine private DependencyProperty verwenden, um den "echten" Wert zu speichern, die Sie interessieren, oder nur eine private Variable.

In der Eigenschaft geändertenen Rückruf, immer den Wert wieder zurück auf den ursprünglichen Wert, während den neuen Wertes Verstauen, die eingestellt wurde.

Ich verbringe die meiste Zeit jetzt Silverlight-Steuerelement Entwicklung zu tun, so dass diese Eigenschaft funktioniert in WPF und Silverlight-Land und coercian oder etwas Spaß wie das nicht verwenden. Vielleicht wird es Sie auf dem richtigen Weg gehen, aber.

    /// <summary>
    /// Sets the write-only dependency property.
    /// </summary>
    public string MyWriteOnlyDependencyProperty
    {
        set { SetValue(MyWriteOnlyDependencyPropertyProperty, value); }
    }

    private string _theRealSetValue;

    private bool _ignorePropertyChange;

    /// <summary>
    /// Identifies the MyWriteOnlyDependencyProperty dependency property.
    /// </summary>
    public static readonly DependencyProperty MyWriteOnlyDependencyPropertyProperty =
        DependencyProperty.Register(
            "MyWriteOnlyDependencyProperty",
            typeof(string),
            typeof(TemplatedControl1),
            new PropertyMetadata(null, OnMyWriteOnlyDependencyPropertyPropertyChanged));

    /// <summary>
    /// MyWriteOnlyDependencyPropertyProperty property changed handler.
    /// </summary>
    /// <param name="d">TemplatedControl1 that changed its MyWriteOnlyDependencyProperty.</param>
    /// <param name="e">Event arguments.</param>
    private static void OnMyWriteOnlyDependencyPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TemplatedControl1 source = d as TemplatedControl1;
        if (source._ignorePropertyChange)
        {
            source._ignorePropertyChange = false;
            return;
        }
        string value = e.NewValue as string;

        source._theRealSetValue = value;

        // Revert, since this should never be accessible through a read
        source._ignorePropertyChange = true;
        source.SetValue(e.Property, e.OldValue);
    }

Es sieht aus wie Sie die CoerceValueCallback im Zusammenhang mit der Eigenschaft über die FrameworkPropertyMetadata angewandt in der Abhängigkeitseigenschaftsdefinition verwenden können. Nur einen Rückruf installieren, die das zweite Argument, um den neuen Wert, übergibt sie an das Objekt über den eigenen Schreib einzigen Mechanismus, dann kehrt null (oder für Werttypen, default(T)).

Es ist wahr, dass „.NET den ursprünglichen Wert vor dem Zwang, erinnert mich“, aber es wird nicht über Datenbindung vermehrt werden. Anrufe auf GetValue die dazu gezwungen Wert zurück, die nichts undicht werden.

Ich verwende diese Einweg Convenience-Setter für den Wert meiner primären Eigenschaft zu implementieren, die eine Folge von Bytes ist. Ein Benutzer kann eine Zeichenfolge binden, beispielsweise die primäre Eigenschaft auf das codierte Bytes (ASCII oder UTF-8, je nachdem, was Eigenschaft gesetzt ist) einzustellen. Aber nicht alle Byte-Sequenzen sind gültig UTF-8, so dass es nicht möglich ist, die Umwandlung rückgängig zu machen und einen String zurück durch die Bequemlichkeit Eigenschaft zu lesen.

public string AsciiData
{
    set { BinaryArray = Encoding.ASCII.GetBytes(value); }
}

public static readonly DependencyProperty AsciiDataProperty =
    DependencyProperty.Register("AsciiData",
        typeof(string),
        typeof(HexView),
        new FrameworkPropertyMetadata(null, CoerceAsciiData));

private static object CoerceAsciiData(DependencyObject target, object value)
{
    (target as HexView).AsciiData = value as string;
    return null;
}

Der Zwang Handler über Metadaten Ersatz entfernt werden kann, so dass diese bietet nicht Sicherheit , aber es wird die Entwickler nicht versehentlich Kopplung in falschen Wegen zu schaffen.

Ich bin verwirrt, warum können Sie nicht nur haben die ‚get‘ Rückkehr nichts Nützliches?

Aber darüber hinaus vielleicht gerade Sie nicht implementieren die ‚OnMyWriteOnlyDependencyPropertyPropertyChanged‘, in Jeffs Beispiel.

kein wirklicher Grund, um das Ereignis zu haben, wenn niemand es lesen kann, nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top