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.
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?
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.
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.
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