'How to bind column header to property in ViewModel? (WPF MVVM)
I Have window that have DataContext that is bind to ViewModel object (VM1 for the example). VM1 have a lot of properties and one of them is a string that called "MyTitle".
I have a DataGridTextColumn in 'Window\Grid\DataGrid'. How can I bind the property "Header" in DataGridTextColumn to the Property "MyTitle" in my VM1 ViewModel?
Thanks!
Solution 1:[1]
Unfortunately, the column definitions of the DataGrid
don't inherit the DataContext
, because they're not part of the visual tree, so you can't bind directly to the ViewModel. You need to resort to a workaround such as the one described in this article:
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
...
<DataGridTextColumn Header="{Binding Data.MyTitle, Source={StaticResource proxy}}"/>
Solution 2:[2]
The accepted answer didn't work for me.
I was able to make this work.
<FrameworkElement x:Name="proxy" DataContext="{Binding}"/>
<DataGridTextColumn Header="{Binding Source={x:Reference proxy}, Path=DataContext.MyTitle}/>
Solution 3:[3]
There is no need to use a binding proxy, like too often suggested.
Obviously, DataGridColumn.Header
is not a DependencyProperty
. To still bind it, simply define the Header
explicitly using XAML property element syntax, and bind the header content:
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn>
<DataGridTextColumn.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.TextValue}" />
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Thomas Levesque |
Solution 2 | Neil B |
Solution 3 | BionicCode |