Run this, and be confused:
<Window x:Class="Data_Grids.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<DataGrid
Name="r1"
ItemsSource="{Binding Path=.}">
</DataGrid>
<DataGrid
Name="r2"
ItemsSource="{Binding Path=.}">
</DataGrid>
</StackPanel>
</Window>
Codebehind:
using System.Data;
using System.Windows;
namespace Data_Grids
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTable dt1, dt2;
dt1 = new DataTable();
dt2 = new DataTable();
dt1.Columns.Add("a-name", typeof(string));
dt1.Columns.Add("b-name", typeof(string));
dt1.Rows.Add(new object[] { 1, "Hi" });
dt1.Rows.Add(new object[] { 2, "Hi" });
dt1.Rows.Add(new object[] { 3, "Hi" });
dt1.Rows.Add(new object[] { 4, "Hi" });
dt1.Rows.Add(new object[] { 5, "Hi" });
dt1.Rows.Add(new object[] { 6, "Hi" });
dt1.Rows.Add(new object[] { 7, "Hi" });
dt2.Columns.Add("a.name", typeof(string));
dt2.Columns.Add("b.name", typeof(string));
dt2.Rows.Add(new object[] { 1, "Hi" });
dt2.Rows.Add(new object[] { 2, "Hi" });
dt2.Rows.Add(new object[] { 3, "Hi" });
dt2.Rows.Add(new object[] { 4, "Hi" });
dt2.Rows.Add(new object[] { 5, "Hi" });
dt2.Rows.Add(new object[] { 6, "Hi" });
dt2.Rows.Add(new object[] { 7, "Hi" });
r1.DataContext = dt1;
r2.DataContext = dt2;
}
}
}
I'll tell you what happens. The top datagrid is populated with column headers and data. The bottom datagrid has column headers but all the rows are blank.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With