Comment utiliser la réflexion pour obtenir le BindingExpression (et la valeur) pour les contrôles ayant une ContentProperty dans Silverlight
-
21-09-2019 - |
Question
Je dois utiliser la réflexion pour obtenir la valeur de liaison dans un contrôle qui est un DataGridTemplateColumn
(par exemple HyperLinkButton
). Est-ce que quelqu'un sait comment je pourrais le faire?
Il semble assez simple à faire cela avec un TextBlock
parce qu'il a une propriété de dépendance TextProperty
, mais je ne peux pas sembler obtenir une expression de liaison d'un contrôle qui ne dispose pas d'un TextProperty
immédiat. Voici le code que je utilise pour acquérir l'expression de liaison pour une TextBlock
:
FrameworkElement fe = (FrameworkElement)dependencyObj;
FieldInfo fi = fe.GetType().GetField("TextProperty");
BindingExpression bindingExpression = fe.GetBindingExpression((DependencyProperty)fi.GetValue(null))
Cependant, le code suivant ne fonctionne jamais pour un objet de dépendance qui est un HyperLinkButton
:
FieldInfo fi = fe.GetType().GetField("ContentProperty");
Est-ce que quelqu'un sait comment je pourrais être en mesure d'obtenir la BindingExpression
(et la valeur de liaison) pour le contenu d'un HyperLinkButton
?
La solution
avez-vous essayé d'ajouter les drapeaux de liaison correct pour ce champ? Cela ressemble à un cas de drapeaux de liaison inadaquate lors de l'utilisation de réflexion. TextBlock a le texte champ statique à droite sur TextBlock, où que HyperlinkButton a hérité de contenu ContentControl.
Essayez d'utiliser les drapeaux de liaison statique et publics et FlattenedHierarchy:
FieldInfo fi = fe.GetType().GetField("ContentProperty", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
ajouter le drapeau de liaison réflexion FlattenHierarchy devrait dire la réflexion pour rechercher dans la hiérarchie des classes pour trouver ce champ statique public.