带有AutoGenerateColumns的WPF Datagrid中的ItemTemplateSelector

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

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

似乎这种特殊组合效果不佳 –
甚至没有调用模板选择器。

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

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

我们的数据网格定义相当简单:

      

项模板选择器定义

      

第一,

ItemTemplate和ItemTemplateSelector是在DataGrid中故意忽略的inheritance属性,因为它们并不像ItemsControl中那样真正应用于DataGrid。

其次,如果您想要根据其值修改单元格模板,则需要在DataGridTemplateColumn上查找CellTemplateSelector

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

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

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

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

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

我们可以inheritance类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; } } 

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

 private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { DataTemplate template = null; // Four lines below replace the DataTemplateSelector // You need to select the desired template according to your conditions if (e.PropertyType.IsAssignableFrom(typeof(IEnumerable))) template = (DataTemplate)Resources["MyClass2CollectionTemplate"]; else if (e.PropertyType.IsAssignableFrom(typeof(MyClass2))) template = (DataTemplate)Resources["MyClass2Template"]; if (template != null) { var col = new DataGridProcessContainerColumn(); col.Binding = (e.Column as DataGridBoundColumn).Binding; col.ContentTemplate = template; col.Header = e.Column.Header; e.Column = col; } } 

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

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