在WPF DataGrid自动生成的列中使用CellTemplateSelector强制DataTemplateCell

时间:2012-01-16 10:10:03

标签: wpf datagrid datagridtemplatecolumn datatemplateselector

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

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

我想要做的是强制所有自动生成的列为DataTemplateColumns,其中CellTemplateSelector属性设置为FieldCellTemaplateSelector对象。为此,我将以下代码添加到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类型。我的战场发生了什么事?它消失了吗?任何人都可以让我知道如何实现它或如何解决这个问题

提前致谢。

1 个答案:

答案 0 :(得分:1)