WPF Datagrid binding errors with dots in column headers

前端 未结 2 999
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-17 06:21

I have a .Net datatable that I am using as a source to a WPF datagrid. The problem I have is that some of the column headers in the datatable contain dots. When binding the

2条回答
  •  心在旅途
    2020-12-17 06:33

    Magnus Montin has solved the question at Microsot WPF Forum :

    AutoGeneratedColumns are rarely useful in real-world scenarios. But you could also handle the AutoGeneratingColumn event:

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

    Anyway, this kind of view related code certainly belongs to the view. The view model doesn't know nor care about the fact that the DataGrid control cannot display the actual data for some reason. This has to be and should be fixed in the view.

    It works like a charm! My example started to work:

    XAML:

      
    

    Code behind:

    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 + "]") 
       };
    }
    

    ViewModel:

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

提交回复
热议问题