1

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 型です。私のフィールドに何が起こったのですか?消えましたか?誰かがそれを取得する方法、またはこの問題の解決策を達成する方法を教えてもらえますか

前もって感謝します。

4

0 に答える 0