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.
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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With