带有AutoGenerateColumns的WPF Datagrid中的ItemTemplateSelector

时间:2014-12-29 08:37:58

标签: c# wpf mvvm datagrid itemtemplateselector

在我们的数据网格中,我们使用ItemTemplateSelector根据绑定到特定单元格的数据在两个数据模板之间切换。

由于列数取决于当前数据集,我们在AutoGenerateColumns中使用DataGrid

看来这种特殊组合效果不佳 -
甚至没有调用模板选择器。

我们可以在自动创建列的数据网格中使用模板选择器吗?

更具体地说:这是否可以仅使用 XAML 将逻辑放入代码隐藏文件或使用自定义行为?

我们的数据网格定义非常简单:

 <DataGrid
     ItemTemplateSelector="{StaticResource myCustomDataTemplateSelector}"
     ItemsSource="{Binding MyData}">
     <DataGrid.Columns>
     </DataGrid.Columns>
 </DataGrid>

项目模板选择器定义

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:CustomDataTemplateSelector x:Key="myCustomDataTemplateSelector"/>
    </ResourceDictionary>
</UserControl.Resources>

2 个答案:

答案 0 :(得分:6)

首先,

  

ItemTemplate和ItemTemplateSelector是继承的属性   在DataGrid中故意忽略它们,因为它们并不真正适用   DataGrid就像它们在ItemsControl中的意图一样。

其次, 如果您的意思是要根据其值修改单元格,请在CellTemplateSelector上查找DataGridTemplateColumn

但是,当您自动生成列时,它已自动选择基础类型。

您可以在GeneratingColumns事件中覆盖该行为。

请参阅:Force DataTemplateCell with CellTemplateSelector in WPF DataGrid Autogenerated columns

如果您需要更多控制权,可能需要查看https://zamjad.wordpress.com/2011/09/17/datagrid-with-dynamic-columns-revisited/

答案 1 :(得分:0)

我最近遇到了这个问题并以这种方式解决了这个问题:

我们可以继承类git rev-list

DataGridBoundColumn

接下来,在生成列的事件处理程序中,我执行:

public class DataGridProcessContainerColumn : DataGridBoundColumn
{
    public DataTemplate ContentTemplate { get; set; }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        throw new NotImplementedException();
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var control = new ContentControl();
        control.ContentTemplate = ContentTemplate;
        BindingOperations.SetBinding(control, ContentControl.ContentProperty, Binding);
        return control;
    }
}

在窗口的资源中,我有相应的模板。

可以通过DataTemplateSelector完成,但没有时间。