WPF Datagrid绑定错误与列标题中的点

时间:2012-12-07 14:43:46

标签: c# wpf data-binding

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

在网上阅读后,我发现点是数据绑定引擎中使用的特殊符号,并且混淆了数据网格对表的绑定。

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

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:4)

正如您所发现的,除Binding以外的其他任何内容的点符号都会导致WPF出现问题。我建议修改标题以使用点表示法对列名称进行别名:

Col.A should be Col_A
Col.B should be Col_B
etc...

如果标头来自直接SQL查询,请以相同方式为sql列名称添加别名。

沿着使用点符号的路径将继续导致一个hackish修复解决之前的'修复'。只需修改命名约定即可轻松解决所有这些问题。

答案 1 :(得分:3)

Magnus Montin已解决the question at Microsot WPF Forum

  

AutoGeneratedColumns在实际场景中很少有用。但   您还可以处理AutoGeneratingColumn事件:

<DataGrid Name="dataGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />


 private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
 {
    e.Column = new DataGridTextColumn() { Header = e.PropertyName, Binding = new Binding("[" + e.PropertyName + "]") };
 }
  

无论如何,这种视图相关代码肯定属于视图。   视图模型不知道也不关心DataGrid的事实   由于某种原因,控件无法显示实际数据。这必须是   并且应该在视图中修复。

它就像一个魅力!我的例子开始起作用了:

<强> XAML:

<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);
    }
}