DataTable をバインドするデータ グリッドがあります。データ テーブルに含まれる行または列がわからないので、データ グリッドの AutogenerateColumns プロパティを true に設定します。私が確実に知っている唯一のことは、データ テーブル内のすべてのセルが Field 型になり、Field クラスには Type という列挙型プロパティがあることです。
<DataGrid
x:Name="dg"
AutoGenerateColumns="True"
ItemsSource="{Binding Path=Fields}"
AutoGeneratingColumn="dg_AutoGeneratingColumn">
</DataGrid>
私がやりたいことは、自動生成されたすべての列を、CellTemplateSelector プロパティが FieldCellTemaplateSelector オブジェクトに設定された DataTemplateColumns にすることです。これを行うには、次のコードを AutoGeneratingColumn イベントに追加します。
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
//cancel the auto generated column
e.Cancel = true;
//create a new template column with the CellTemplateSelector property set
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
dgtc.CellTemplateSelector = new FieldCellTemplateSelector();
dgtc.IsReadOnly = true;
dgtc.Header = e.Column.Header;
//add column to data grid
DataGrid dg = sender as DataGrid;
dg.Columns.Add(dgtc);
}
FieldCellTemplateSelector クラスのコードは次のとおりです。
public class FieldCellTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return base.SelectTemplate(item, container);
}
}
SelectTemplate メソッドでは、セルに含まれる Field オブジェクトを取得し、そのフィールドの Type プロパティに基づいて関連するデータ テンプレートを返す必要があります。問題は、渡された項目パラメーターが Field 型ではなく、DataRowView 型であることです。
次のようにして DataGridCell オブジェクトを取得できます。
ContentPresenter presenter = container as ContentPresenter;
DataGridCell cell = presenter.Parent as DataGridCell;
ただし、セルのデータ コンテキストも DataRowView 型です。私のフィールドに何が起こったのですか?消えましたか?誰かがそれを取得する方法、またはこの問題の解決策を達成する方法を教えてもらえますか
前もって感謝します。