簡體   English   中英

WPF Datagrid綁定錯誤,列標題中帶有點

[英]WPF Datagrid binding errors with dots in column headers

我有一個.Net數據表,用作WPF數據網格的源。 我的問題是數據表中的某些列標題包含點。 將數據表綁定到數據網格時,將顯示包含點的列,但不包含數據。

在網上閱讀后,我發現點是數據綁定引擎中使用的特殊符號,並且混淆了數據網格到表的綁定。

我嘗試手動創建datagrid列+綁定,並添加方括號以使點無效。 這工作正常,但是當我對列進行排序時會中斷。 本文提到掛鈎到排序事件以刪除排序事件上的[]。 如何實現這一目標沒有太多細節,我嘗試過的工作似乎也沒有擺脫錯誤。

如果您需要更多信息,請告訴我。

正如您所發現的那樣,WPF除了Binding以外的其他任何點符號都存在問題。 我建議您修改標題,以點名稱為列名加上別名:

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

如果標頭來自直接的SQL查詢,則以相同的方式為sql列名稱添加別名。

沿着使用點符號的道路前進,只會繼續導致一個駭人的修復程序來解決先前的“修復程序”。 只需修改命名約定,即可輕松解決所有這些問題。

Magnus Montin 在Microsot WPF論壇上解決了這個問題

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM