1

我有一个绑定 DataTable 的数据网格。我不知道数据表中有哪些行或列,所以我将数据网格的 AutogenerateColumns 属性设置为 true。我唯一确定的是,数据表中的每个单元格都是 Field 类型,并且 Field 类有一个名为 Type 的枚举属性。

<DataGrid
    x:Name="dg"
    AutoGenerateColumns="True"
    ItemsSource="{Binding Path=Fields}"
    AutoGeneratingColumn="dg_AutoGeneratingColumn">
</DataGrid>

我想要做的是强制所有自动生成的列都是 DataTemplateColumns,它们的 CellTemplateSelector 属性设置为 FieldCellTemplateSelector 对象。为此,我将以下代码添加到 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 属性返回相关的数据模板。问题是传递的 item 参数不是 Field 类型,而是 DataRowView 类型。

我可以通过执行以下操作来获取 DataGridCell 对象:

ContentPresenter presenter = container as ContentPresenter;
DataGridCell cell = presenter.Parent as DataGridCell;

但是,单元格的数据上下文也是 DataRowView 类型。我的领域发生了什么事?它消失了吗?谁能让我知道如何解决这个问题或我如何解决这个问题

提前致谢。

4

0 回答 0