Como usar a reflexão para obter a BindingExpression (e o valor) para os controles com um ContentProperty em Silverlight
-
21-09-2019 - |
Pergunta
Eu preciso usar a reflexão para obter o valor de ligação em um controle que é um DataGridTemplateColumn
(por exemplo: HyperLinkButton
). Alguém sabe como eu posso fazer isso?
Parece simples o suficiente para fazer isso com um TextBlock
Porque tem um TextProperty
propriedade de dependência, mas não consigo obter uma expressão vinculativa de um controle que não tenha um imediato TextProperty
. Aqui está o código que estou usando para adquirir a expressão vinculativa para um TextBlock
:
FrameworkElement fe = (FrameworkElement)dependencyObj;
FieldInfo fi = fe.GetType().GetField("TextProperty");
BindingExpression bindingExpression = fe.GetBindingExpression((DependencyProperty)fi.GetValue(null))
No entanto, o código a seguir nunca funciona para um objeto de dependência que é um HyperLinkButton
:
FieldInfo fi = fe.GetType().GetField("ContentProperty");
Alguém sabe como eu posso conseguir o BindingExpression
(e valor vinculativo) para o conteúdo de um HyperLinkButton
?
Solução
Você já tentou adicionar os sinalizadores de ligação corretos para esse campo? Parece um caso de sinalizadores de ligação inadaquados ao usar a reflexão. O TextBlock possui um campo estático de texto no texto, onde o HyperlinkButton tem o conteúdo herdado do ContentControl.
Tente usar as bandeiras de ligação estáticas e públicas e flattenedhierarchy:
FieldInfo fi = fe.GetType().GetField("ContentProperty", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
Adicionar a bandeira de ligação à reflexão Flattenhierarchy deve dizer à reflexão para procurar na hierarquia de classes para encontrar esse campo estático público.