运行它,并感到困惑:
<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>
代码隐藏:
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;
}
}
}
我会告诉你会发生什么。顶部数据网格填充了列标题和数据。底部数据网格有列标题,但所有行都是空白的。
答案 0 :(得分:17)
您可以将AutoGenerateColumns设置为true并添加一个事件处理程序来处理任何句点(或其他特殊字符):
<DataGrid
Name="r2"
ItemsSource="{Binding Path=.}"
AutoGeneratingColumn="r2_AutoGeneratingColumn">
</DataGrid>
代码隐藏:
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 + "]");
}
}
在MVVM场景中,这对我来说效果更好。
答案 1 :(得分:16)
绑定路径解析器错误地解释了第二个表的列名中的句号。在此示例运行时查看调试输出,您可以看到自动生成的列已绑定到'a'和'b'而不是'a.name'和'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.
在绑定路径中有许多不同的字符具有特殊含义,包括句号('。'),斜线('/'),方括号('[',']')和括号('( ',')'),括号将导致您的应用崩溃。可以通过使用方括号包围绑定路径来转义这些特殊字符。有关路径和字符转义的更多信息,请参阅Binding Declarations Overview
要解决此问题,您必须设置AutoGenerateColumns =“False”并在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>
或以编程方式在
背后的代码中 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;
答案 2 :(得分:3)
FULL STOP(句点/点)字符不起作用 即使用x \ 002E转义也行不通。
以下是使用MIDDLE DOT字符的折衷方案:
dt1.Columns.Add("a\x00B7name", typeof(string));
dt1.Columns.Add("b\x00B7name", typeof(string));
答案 3 :(得分:1)
我最终使用替换ONE DOT LEADER而且效果很好。
我从XML文件导入了数据,而不是在代码中的任何地方使用string.replace(".","\x2024");
,更改导入文件更容易。
Before
<Components Description="Thru Tee" Size="0.5" Kv="0.54" />
After
<Components Description="Thru Tee" Size="0․5" Kv="0.54" />