You should use 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-behind:
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 that better solution will be create new class e.g HeaderData
and after that you can create instance of it in xaml and binding to this class.
Example:
Class to hold 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>