2012-01-17 19 views
7

Sé que esta pregunta se ha hecho antes, pero ninguna de las respuestas anteriores "" parece que funciona para mí ...Binding cuadrícula de datos de cabecera de la columna DataContext

he implementado una funcionalidad para múltiples idiomas en mi solicitud, y, por lo tanto, tengo que vincular el encabezado de mis columnas DataGrid al DataContext.

Puedo usar un diccionario (llamado texto en el ejemplo a continuación) en el DataContext para almacenar los textos y las obras de enlace bien con bloques de texto, botones, etc.

<TextBlock Text="{Binding Text[Name], FallbackValue='Name'" /> 

Pero, no puedo conseguir este para trabajar en el atributo de encabezado de las columnas de DataGrid.

Leí en alguna parte, que necesito escribir una plantilla para la columna/encabezado para lograr esto, pero tampoco puedo resolver esto.

Respuesta

27

Es posible que tenga que subir al árbol para obtener el DataContext que desee:

<DataGridTextColumn Binding="{Binding Name}"> 
    <DataGridTextColumn.HeaderTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding DataContext.Text[Name], 
         RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
     </DataTemplate> 
    </DataGridTextColumn.HeaderTemplate> 
</DataGridTextColumn> 

hacer esto directamente en la propiedad Header no va a funcionar porque no puede ser resuelto en el lugar que la columna es una objeto abstracto que no aparece en el árbol.

+0

Gracias. Eso funcionó muy bien! –

+1

Encabezado vs HeaderTemplate fue la clave. Gracias. –

+0

De hecho, relativeSource hace el truco. ¡Genial, gracias! –

3

correcto. no hay elemet en el árbol visual mapeando directamente a DataGridTextColumn por lo que no puede usar RelativeSource con AncestorType (es decir, DataGridTextColumn no es un control, por lo tanto, no tiene un control principal). a continuación código debería funcionar bien

<DataGridTextColumn Binding="{Binding Name}"> 
    <DataGridTextColumn.Header> 
    <TextBlock Text="{Binding DataContext.Text[Name], 
         RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
    </DataGridTextColumn.Header> 
</DataGridTextColumn> 
+0

Gracias, esto es menos doloroso que la solución HeaderTemplate, y todavía funciona. ¿Pero hay una manera de hacer el mismo truco usando un atributo 'Header = '' (Some binding binding}' '? –

+0

Buena explicación, gracias. – rPulvi

+0

Probé esto en .NET 4.5 y 4.6 y, aunque funcionó, generó un comportamiento inconsistente en el que 'DataGrid' no se actualizaría de forma confiable cuando se actualizó el objeto enlazado. Sin embargo, el método en la respuesta aceptada sí funciona de manera consistente. – fuglede

Cuestiones relacionadas