Run this, and be confused:
I ended up using the substituting the ONE DOT LEADER and it worked great.
I imported my data from an XML file and instead of using string.replace(".","\x2024");
everywhere in my code it was easier to change the import file.
Before
<Components Description="Thru Tee" Size="0.5" Kv="0.54" />
After
<Components Description="Thru Tee" Size="0․5" Kv="0.54" />
You can keep AutoGenerateColumns set to true and add an eventhandler to deal with any periods (or other special characters):
<DataGrid
Name="r2"
ItemsSource="{Binding Path=.}"
AutoGeneratingColumn="r2_AutoGeneratingColumn">
</DataGrid>
Codebehind:
private void r2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName.Contains('.') && e.Column is DataGridBoundColumn)
{
DataGridBoundColumn dataGridBoundColumn = e.Column as DataGridBoundColumn;
dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]");
}
}
This worked better for me in a MVVM scenario.
The FULL STOP (period/dot) character does not work.
Even escaping with x\002E did not work.
Here is a compromise using the MIDDLE DOT character:
dt1.Columns.Add("a\x00B7name", typeof(string));
dt1.Columns.Add("b\x00B7name", typeof(string));
The full stop character in the column names of the second table are incorrectly interpreted by the binding path parser. Look at the debug output while this example is running and you can see that the auto-generated columns have been bound to 'a' and 'b' rather than 'a.name' and 'b.name'
System.Windows.Data Error: 40 : BindingExpression path error: 'a' property not found on 'object' ''DataRowView' ... etc.
System.Windows.Data Error: 40 : BindingExpression path error: 'b' property not found on 'object' ''DataRowView' ... etc.
There are a number of different characters which have special meaning in a binding path including full stop ('.'), slash ('/'), square brackets ('[',']') and parenthesis ('(',')'), the parenthesis will cause your app to crash. These special characters can be escaped by surrounding the binding path with square brackets. More information about paths and character escaping can be found in the Binding Declarations Overview
To fix this you will have to set AutoGenerateColumns="False" and specify the column bindings in the xaml:
<DataGrid
x:Name="r2"
ItemsSource="{Binding .}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="a.name" Binding="{Binding Path=[a.name]}" />
<DataGridTextColumn Header="b.name" Binding="{Binding Path=[b.name]}" />
</DataGrid.Columns>
</DataGrid>
or programmatically in the code behind
r2.AutoGenerateColumns = false;
foreach( DataColumn column in dt2.Columns )
{
var gridColumn = new DataGridTextColumn()
{
Header = column.ColumnName,
Binding = new Binding( "[" + column.ColumnName + "]" )
};
r2.Columns.Add( gridColumn );
}
r2.DataContext = dt2;