2012-01-17 2 views
7

So che questo problema è stato fatto prima, ma nessuna delle risposte precedenti "" sembra lavorare per me ...Binding DataGrid colonna di intestazione di DataContext

Ho implementato una funzionalità per la multi lingue nella mia richiesta, e quindi non devo legare l'intestazione delle mie colonne DataGrid al DataContext.

Io uso un dizionario (chiamato Testo nell'esempio qui sotto) nella DataContext per memorizzare i testi, e le opere di legame bene con TextBlocks, bottoni ecc

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

Ma, non riesco a ottenere questo lavorare sull'attributo Header delle colonne DataGrid.

Ho letto da qualche parte, che ho bisogno di scrivere un modello per la colonna/intestazione per ottenere questo, ma non riesco a capire neanche questo.

risposta

27

Potrebbe essere necessario tornare indietro l'albero per ottenere il DataContext si desidera:

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

fare questo direttamente sulla proprietà Header non funziona perché non può essere risolto sul posto, come la colonna è un oggetto astratto che non appare nell'albero.

+0

Grazie. Ha funzionato alla grande! –

+1

Header vs HeaderTemplate era la chiave. Grazie. –

+0

Infatti, l'origine relativa fa il trucco. Fantastico thx! –

3

corretto. non ci sono elemet nell'albero visivo che mappano direttamente a DataGridTextColumn quindi non è possibile utilizzare RelativeSource con AncestorType (ad esempio, DataGridTextColumn non è un controllo, quindi non ha un controllo genitore). sotto il codice dovrebbe funzionare bene

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

Grazie, questo è meno doloroso della soluzione HeaderTemplate e funziona ancora. Ma c'è un modo per fare lo stesso trucco usando un attributo 'Header =" {Some stringified binding} "'? –

+0

Bella spiegazione, grazie. – rPulvi

+0

Provato su .NET 4.5 e 4.6 e mentre funzionava in qualche modo, portava a comportamenti inconsistenti in cui 'DataGrid' non si aggiornava in modo affidabile quando l'oggetto associato veniva aggiornato. Il metodo nella risposta accettata funziona comunque in modo coerente. – fuglede