Laden...

Ist DependencyProperty gesetzt?

Erstellt von Xqgene vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.643 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 12 Jahren
Ist DependencyProperty gesetzt?

Wie kann man in nach hinein feststellen, ob eine DependencyProperty gesetzt wurde?
Also, ob ein Wert zugewiesen wurde?

Konkret geht es mir darum ein Run-Objekt zu kopieren. Es sollen nur die Eigenschaften kopiert werden, die auch wirklich gesetzt wurden.

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Xqgene,

du könntest zum einen Buch in einem HashSet<DependencyProperty> führen, welche Properties geändert worden.

Ansonsten könntest du prüfen, ob Wert == Property.DefaultMetadata.DefaultValue zutrifft bzw. der Wert als "gleich" anzusehen ist (leere Collection etc.).
Alternativ könntest natürlich direkt auf die entsprechende Property des neuen Objektes zugreifen.

Es existiert zwar auch DependencyProperty.UnsetValue - dieser scheint jedoch eine andere Bedeutung zu haben.

Generell müsste die DepenencyProperty zwar "wissen", ob sie geändert wurde (siehe hierzu das Konzept aus Dependency Property Value Precedence) - mir ist allerdings kein Weg bekannt, direkt darauf zuzugreifen.
Evtl. geht's ja via Reflection.

Aber letztlich ist es doch eigentlich egal, wenn du auch nicht gesetzte Werte kopierst, oder?

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 12 Jahren

Egal ist es leider nicht. wenn eine Eigenschaft nicht gesetzt ist wird, diese aus einem Parent Element ermittelt. Z.B. Wenn FontSize in dem Run Objekt nicht gesetzt ist wird diese von TextBlock genommen. Sobald die Eingenschaft gesetzt ist, gilt diese für Darstellung etc.

Reflection ist aus Performance Günden kommt als allerletzte Möglichkeit in Betrachtung.

Bleibt also die HashSet Variante.

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

die einfachste Möglichkeit sollte sein, das Run Element mit dem XAMLWriter zu serialisieren und dann per XAMLReader zu deserialisieren.

DependencyProperty.UnsetValue ist schon besser als die Variante mit Property.DefaultMetadata.DefaultValue. Wenn man mit dem DefaultValue arbeitet hat man verloren bei Werttypen oder Typen mit Wertesemantik wie String. Da hat man keine Möglichkeit zu unterscheiden ob es lokal gesetzt wurde, oder ob der Wert aus einer anderen Quelle kommt.

UnsetValue dagegen bedeutet wirklich, dass der Wert noch nicht gesetzt wurde, wodurch auch immer. Hier muss man nur aufpassen, dass GetValue nie UnsetValue zurückgibt. Man muss da explizit ReadLocalValue benutzen. Trotzdem dürfte die Variante per XAML die einfachste sein.

Baka wa shinanakya naoranai.

Mein XING Profil.

R
41 Beiträge seit 2005
vor 12 Jahren

Hallo Xqgene,

wenn es darum geht, die lokal gesetzten Werte einer DependencyProperty zu ermitteln, also keine die z.B. durch Trigger oder Setter zugewiesen wurde, kannst du mit der Methode "ReadLocalValue" von DependencyObject den Wert lesen der durch "SetValue" zuletzt gesetzt wurde.
Wurde noch kein Wert gesetzt oder der letzte lokal gesetzte Wert mit "ClearValue" wieder gelöscht, erhältst du als Rückgabewert "DependencyProperty.UnsetValue".
D.h. du brauchst nur deine Properties durchzugehen und überall wo mit "ReadLocalValue" nicht "DependencyProperty.UnsetValue" rauskommt, ist ein lokaler Wert gesetzt.

Viele Grüße
redMars