You should use a multi-value converter ( msdn ).
XAML:
<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding ObjectList}" RowDetailsVisibilityMode="VisibleWhenSelected" > <DataGrid.Resources> <cust:UnitConverter x:Key="unitCon" /> <DataTemplate x:Key="CustomHeaderTemplate"> <StackPanel> <TextBlock Text="{Binding}" /> <TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource unitCon}"> <Binding Path="Columns" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" /> <Binding Path="." /> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </DataTemplate> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn x:Name="SpeedColumn" Width="1*" Binding="{Binding Speed}" Header="Speed" HeaderTemplate="{StaticResource CustomHeaderTemplate}" cust:CustomHeader.Unit="[m/s]" /> <DataGridTextColumn x:Name="SpeedColumn2" Width="1*" Binding="{Binding Speed2}" Header="Speed2" HeaderTemplate="{StaticResource CustomHeaderTemplate}" cust:CustomHeader.Unit="[km/h]" /> </DataGrid.Columns> </DataGrid>
Code for:
public class UnitConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string result = null; ObservableCollection<DataGridColumn> columns = values[0] as ObservableCollection<DataGridColumn>; string headerName = values[1].ToString(); var coll = columns.Where(x => x.Header.ToString() == headerName).FirstOrDefault(); if (coll != null) result = CustomHeader.GetUnit(coll); return result; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
I think the best solution would be to create a new class, for example HeaderData , and after that you can instantiate it in xaml and bind to this class.
Example:
Class for storing header data:
class HeaderData { public string Name { get; set; } public string Unit { get; set; } }
XAML Code:
<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding ObjectList}" RowDetailsVisibilityMode="VisibleWhenSelected" > <DataGrid.Resources> <DataTemplate x:Key="CustomHeaderTemplate"> <StackPanel> <TextBlock Text="{Binding Name}" /> <TextBlock Text="{Binding Unit}" /> </StackPanel> </DataTemplate> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn x:Name="SpeedColumn" Width="1*" Binding="{Binding Speed}" HeaderTemplate="{StaticResource CustomHeaderTemplate}"> <DataGridTextColumn.Header> <cust:HeaderData Name="Speed" Unit="[m/s]" /> </DataGridTextColumn.Header> </DataGridTextColumn> <DataGridTextColumn x:Name="SpeedColumn2" Width="1*" Binding="{Binding Speed2}" HeaderTemplate="{StaticResource CustomHeaderTemplate}"> <DataGridTextColumn.Header> <cust:HeaderData Name="Speed2" Unit="[km/h]" /> </DataGridTextColumn.Header> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
source share