Come utilizzare la riflessione per ottenere l'espressione di binding (e il valore) per i controlli con una proproperty di contenuto in Silverlight
-
21-09-2019 - |
Domanda
Devo usare la riflessione per ottenere il valore di legame in un controllo che è a DataGridTemplateColumn
(per esempio HyperLinkButton
). Qualcuno sa come potrei farlo?
Sembra abbastanza semplice farlo con a TextBlock
Perché ha un TextProperty
Proprietà della dipendenza, ma non riesco a ottenere un'espressione vincolante da un controllo che non ha immediato TextProperty
. Ecco il codice che sto usando per acquisire l'espressione vincolante per a TextBlock
:
FrameworkElement fe = (FrameworkElement)dependencyObj;
FieldInfo fi = fe.GetType().GetField("TextProperty");
BindingExpression bindingExpression = fe.GetBindingExpression((DependencyProperty)fi.GetValue(null))
Tuttavia, il seguente codice non funziona mai per un oggetto di dipendenza che è un HyperLinkButton
:
FieldInfo fi = fe.GetType().GetField("ContentProperty");
Qualcuno sa come potrei essere in grado di ottenere il BindingExpression
(e valore vincolante) per il contenuto di a HyperLinkButton
?
Soluzione
Hai provato ad aggiungere i flag di legame corretti per quel campo? Sembra un caso di bandiere vincolanti inadattate quando si utilizza la riflessione. TextBlock ha un campo statico di testo direttamente su Textblock, in cui l'hyperLinkButton ha ereditato il contenuto dal ContentControl.
Prova a usare le bandiere vincolanti statiche e pubbliche e appiattite:
FieldInfo fi = fe.GetType().GetField("ContentProperty", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
L'aggiunta della bandiera vincolante per la riflessione di FlattenHerarchia dovrebbe dire a riflettere di guardare nella gerarchia di classe per trovare quel campo statico pubblico.