在我们的数据网格中,我们使用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>
答案 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完成,但没有时间。