带有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完成,但没有时间。