Ok, this is actually not so simple, since Column - DataGrid objects are not part of the visual tree, and it's not so easy to reach them.
But in your case, you can give the column a name, and reach out by name:
<DataGrid AutoGenerateColumns="False" ColumnWidth="100"> <DataGrid.Resources> <Style TargetType="DataGridColumnHeader"> <Setter Property="ToolTip" Value="{Binding ToolTipText, ElementName=ColumnWithHeader}"/> </Style> </DataGrid.Resources> <DataGrid.Columns> <local:DataGridTextColumnWithHeader x:Name="ColumnWithHeader" Header="!hello" ToolTipText="hello!" /> </DataGrid.Columns> </DataGrid>
If you do not want to do the style for each column, you can do without it, using the code behind:
<DataGrid AutoGenerateColumns="False" ColumnWidth="100" Loaded="OnDGLoaded" Name="DG"> <DataGrid.Columns> <local:DataGridTextColumnWithHeader Header="!hello" ToolTipText="hello!"/> </DataGrid.Columns> </DataGrid>
void OnDGLoaded(object sender, RoutedEventArgs e) { foreach (var header in GetVisualChildrenOfType<DataGridColumnHeader>(DG)) { DataGridTextColumnWithHeader column = header.Column as DataGridTextColumnWithHeader; if (column != null) header.ToolTip = column.ToolTipText; } } IEnumerable<T> GetVisualChildrenOfType<T>(FrameworkElement fe) where T : FrameworkElement { T t = fe as T; if (t != null) yield return t; int count = VisualTreeHelper.GetChildrenCount(fe); for (int i = 0; i < count; i++) { FrameworkElement child = VisualTreeHelper.GetChild(fe, i) as FrameworkElement; if (child != null) { foreach (var r in GetVisualChildrenOfType<T>(child)) yield return r; } } }
This will assign the tooltip only once, at boot time. If this is not enough, you can set the binding manually, since you have both objects in the OnDGLoaded loop.