Following code is untested...
For DataGridHeaders to be changed, you would have to override their ContentTemplate.
<DataGrid.Resources>
<Style TargetType="{x:Type dg:DataGridColumnHeader}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DynamicColumnHeaderTextConverter}">
<Binding BindsDirectlyToSource="True"/>
<Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType={x:Type dg:DataGrid}}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
In the above code DynamicColumnHeaderTextConverter's Convert() method will receive 2 values
- Column Header i.e. DataTable Column Name
- DataTable itself.
Based on this return the non-unique names.
public class DynamicColumnHeaderTextConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
var columnName = (string)values[0];
var dataTable = (DataTable)values[1]; //// if you want to decide name based on some value in the DataTable.
switch(columnName)
{
case "MyColumn1" : return "MyColumn";
case "MyColumn2" : return "MyColumn";
}
return columnName;
}
}
Let me know if this helps.