Reputation: 1450
I know this question has been asked before, but none of the "previous" answers seems to work for me...
I have implemented a functionality for multi languages in my application, and I therefor have to bind the header of my DataGrid columns to the DataContext.
I use a dictionary (called Text in the example below) in the DataContext to store the texts, and the binding works fine with textblocks, buttons etc.
<TextBlock Text="{Binding Text[Name], FallbackValue='Name'" />
But, I can't get this to work on the Header-attribute of the DataGrid columns.
I read somewhere, that I need to write a template for the column/header to achieve this, but I can't figure this out either.
Upvotes: 12
Views: 22448
Reputation: 51
correct.
there is no elemet in visual tree directly mapping to DataGridTextColumn
so you can't use RelativeSource
with AncestorType
(i.e. DataGridTextColumn
is not a control hence it doesn't have a parent control).
below code should work fine
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.Header>
<TextBlock Text="{Binding DataContext.Text[Name],
RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
Upvotes: 5
Reputation: 185445
You may need to walk back up the tree to get the DataContext you want:
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.Text[Name],
RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
Doing this directly on the Header
property will not work because it cannot be resolved in-place as the column is an abstract object not appearing in the tree.
Upvotes: 38