2012-01-17 11 views
7

Wiem, że to pytanie zostało zadane wcześniej, ale żaden z „poprzedniej” odpowiedzi wydaje się działać dla mnie ...Binding DataGrid nagłówka kolumny do DataContext

I wdrożyliśmy funkcjonalność dla wielu języków w mojej aplikacji i dlatego muszę powiązać nagłówek moich kolumn DataGrid z DataContext.

używam słownika (zwany tekst w poniższym przykładzie) w DataContext przechowywać teksty, a prace wiążące porządku z TextBlocks, guziki itp

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

Ale nie mogę tego pracować nad atrybutem nagłówka kolumn DataGrid.

Czytałem gdzieś, że muszę napisać szablon dla kolumny/nagłówka, aby to osiągnąć, ale nie mogę tego również rozgryźć.

Odpowiedz

27

może trzeba iść z powrotem w górę drzewa, aby uzyskać DataContext chcesz:

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

Robi to bezpośrednio na posesji Header nie będzie działać, ponieważ nie może być rozwiązany w miejscu jak kolumna jest obiekt abstrakcyjny nie pojawia się w drzewie.

+0

Dzięki. To działało świetnie! –

+1

Header vs HeaderTemplate był kluczem. Dzięki. –

+0

Rzeczywiście relativeSource wykonuje lewę. Wielkie dzięki! –

3

prawidłowe. Nie ma elemet w drzewie wizualnym bezpośrednio mapowania do DataGridTextColumn, więc nie można użyć RelativeSource z AncestorType (tj. DataGridTextColumn nie jest kontrolą, więc nie ma kontroli nadrzędnej). kod poniżej powinien działać poprawnie

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

Dzięki, jest to mniej bolesne niż rozwiązanie HeaderTemplate i nadal działa. Ale czy istnieje sposób na wykonanie tej samej sztuczki za pomocą atrybutu '' Header = "{Some stringified binding}"? –

+0

Ładne wyjaśnienie, dziękuję. – rPulvi

+0

Próbowałem tego na platformach .NET 4.5 i 4.6 i chociaż działało, doprowadziło to do niespójnego zachowania, w którym 'DataGrid' nie zaktualizowałoby się poprawnie po zaktualizowaniu powiązanego obiektu. Metoda w zaakceptowanej odpowiedzi działa jednak konsekwentnie. – fuglede

Powiązane problemy