C# 列标题中带有点的WPF Datagrid绑定错误

C# 列标题中带有点的WPF Datagrid绑定错误,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个.Net数据表,我正在使用它作为WPF数据网格的源。我遇到的问题是datatable中的一些列标题包含点。将datatable绑定到datagrid时,将显示包含点的列,但不包含任何数据 在网上阅读之后,我发现点是数据绑定引擎中使用的一种特殊符号,它混淆了数据网格与表的绑定 我尝试过手动创建datagrid列+绑定,并添加方括号来抵消这些点。这工作正常,但在对列排序时会中断。提到挂接到排序事件以删除排序事件上的[]。关于如何实现这一点,没有太多的细节,我所做的尝试似乎并没有消除错误 如果

我有一个.Net数据表,我正在使用它作为WPF数据网格的源。我遇到的问题是datatable中的一些列标题包含点。将datatable绑定到datagrid时,将显示包含点的列,但不包含任何数据

在网上阅读之后,我发现点是数据绑定引擎中使用的一种特殊符号,它混淆了数据网格与表的绑定

我尝试过手动创建datagrid列+绑定,并添加方括号来抵消这些点。这工作正常,但在对列排序时会中断。提到挂接到排序事件以删除排序事件上的[]。关于如何实现这一点,没有太多的细节,我所做的尝试似乎并没有消除错误


如果您需要更多信息,请告诉我。

正如您所发现的,WPF中除了绑定之外的任何内容的点符号都有问题。我建议您修改标题,将列名命名为点符号:

Col.A should be Col_A
Col.B should be Col_B
etc...
如果标题来自直接SQL查询,请以相同的方式为SQL列名别名

沿着使用点表示法的道路走下去,只会继续导致一个黑客补丁来解决以前的“补丁”。所有这些都可以通过修改命名约定轻松解决。

解决了:

自动生成列
在现实场景中很少有用。但是 您还可以处理
AutoGeneratingColumn
事件:

视图模型

private DataTable employeeDataTable;

public DataTable EmployeeDataTable
{
   get { return employeeDataTable; }
   set
   {
      employeeDataTable = value;
      OnPropertyChanged("EmployeeDataTable");
   }
}

private void PopulateDataTable()
{
    var _ds = new DataSet("Test");
    employeeDataTable = new DataTable();
    employeeDataTable = _ds.Tables.Add("DT");
    for (int i = 0; i < 800; i++)
    {
       if(i%2==0)
           employeeDataTable.Columns.Add(i.ToString() + ".");
       else
           employeeDataTable.Columns.Add(i.ToString() + "/");
    }
    for (int i = 0; i < 2; i++)
    {
       var theRow = employeeDataTable.NewRow();
       for (int j = 0; j < 800; j++)
       {
          if (j % 2 == 0)
          {
            //theRow[j] = j.ToString();
            theRow[j] = "a";
          }
          else
            theRow[j] = CreateDoubleValue(j).ToString();
     }
    employeeDataTable.Rows.Add(theRow);
    }
}
私有数据表employeeDataTable;
公共数据表EmployeeDataTable
{
获取{return employeeDataTable;}
设置
{
employeeDataTable=值;
OnPropertyChanged(“EmployeeDataTable”);
}
}
私有void PopulateDataTable()
{
var_ds=新数据集(“测试”);
employeeDataTable=新数据表();
employeeDataTable=_ds.Tables.Add(“DT”);
对于(int i=0;i<800;i++)
{
如果(i%2==0)
employeeDataTable.Columns.Add(i.ToString()+”);
其他的
employeeDataTable.Columns.Add(i.ToString()+“/”);
}
对于(int i=0;i<2;i++)
{
var theRow=employeeDataTable.NewRow();
对于(int j=0;j<800;j++)
{
如果(j%2==0)
{
//theRow[j]=j.ToString();
theRow[j]=“a”;
}
其他的
theRow[j]=CreateDoubleValue(j).ToString();
}
employeeDataTable.Rows.Add(theRow);
}
}

我可以完全控制列名,但希望能在列标题中包含“.”。例如“粘结后最大厚度”。如果你认为这真的不可能,我可能会在列名中强制执行“否”。我相信这是可能的,就像向上游游一样:)只有一种方法要简单得多。既然你可以完全控制你的命名约定,我肯定会走这条路。也就是说,我很少(如果有的话)使用datatable作为WPF中任何东西的绑定,因为WPF确实是围绕使用属性绑定而设计的,所以很可能还有其他一些方法可以用于datatable和WPF绑定。真是一场噩梦。花几个小时来解决这个问题事实上,到目前为止,这是最好的答案(在我当前的项目中只考虑这个问题)。如果我们需要在列标题中使用任何特殊字符(给定情况下的点、括号),我们将使用它,DataGrid不应限制我们。
<DataGrid ColumnWidth="35" ItemsSource="{Binding EmployeeDataTable, 
    IsAsync=True}" VirtualizingStackPanel.IsVirtualizing="true" 
    EnableRowVirtualization="True" EnableColumnVirtualization="True"
    MaxWidth="2560" MaxHeight="1600"  
    VirtualizingStackPanel.VirtualizationMode="Recycling" 
    VirtualizingPanel.IsVirtualizingWhenGrouping="True"/>  
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
   e.Column = new DataGridTextColumn() { 
       Header = e.PropertyName, 
       SortMemberPath = e.PropertyName, //To allow for sorting on a column 
       Binding = new Binding("[" + e.PropertyName + "]") 
   };
}
private DataTable employeeDataTable;

public DataTable EmployeeDataTable
{
   get { return employeeDataTable; }
   set
   {
      employeeDataTable = value;
      OnPropertyChanged("EmployeeDataTable");
   }
}

private void PopulateDataTable()
{
    var _ds = new DataSet("Test");
    employeeDataTable = new DataTable();
    employeeDataTable = _ds.Tables.Add("DT");
    for (int i = 0; i < 800; i++)
    {
       if(i%2==0)
           employeeDataTable.Columns.Add(i.ToString() + ".");
       else
           employeeDataTable.Columns.Add(i.ToString() + "/");
    }
    for (int i = 0; i < 2; i++)
    {
       var theRow = employeeDataTable.NewRow();
       for (int j = 0; j < 800; j++)
       {
          if (j % 2 == 0)
          {
            //theRow[j] = j.ToString();
            theRow[j] = "a";
          }
          else
            theRow[j] = CreateDoubleValue(j).ToString();
     }
    employeeDataTable.Rows.Add(theRow);
    }
}