3

WPF データグリッドのソースとして使用している .Net データテーブルがあります。私が抱えている問題は、データテーブルの列ヘッダーの一部にドットが含まれていることです。データテーブルをデータグリッドにバインドすると、ドットを含む列が表示されますが、データは含まれません。

ネットで読み回した後、ドットはデータバインディングエンジン内で使用される特別な表記法であり、データグリッドのテーブルへのバインディングを混乱させていることがわかりました。

データグリッドの列とバインディングを手動で作成し、角かっこを追加してドットを無効にしようとしました。これは正常に機能しますが、列を並べ替えると壊れます。この記事で は、並べ替えイベントにフックして、並べ替えイベントの [] を削除する方法について説明します。これを達成する方法の詳細はあまりなく、私が試したことはエラーを取り除くようには見えませんでした.

さらに情報が必要な場合はお知らせください。

4

2 に答える 2

4

Magnus Montinが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);
    }
}
于 2015-12-05T06:44:01.327 に答える
4

あなたが発見したように、以外のドット表記はBindingWPF で問題があります。私がお勧めするのは、ヘッダーを修正して、列名にドット表記でエイリアスを付けることです。

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

ヘッダーが直接の SQL クエリからのものである場合は、同じ方法で SQL 列名に別名を付けます。

ドット表記を使用する道をたどると、前の「修正」を解決するための 1 つのハック的な修正につながります。これらはすべて、命名規則を修正するだけで簡単に解決できます。

于 2012-12-07T15:28:46.670 に答える