我有一个DataGrid,其中包含一个DataTable作为ItemsSource。列的数量随时间变化而不同。如果某个列的数据类型是A类,我想使用DataTemplate自定义单元格内容的外观。
我已经设置了
数据模板长这样。
我已经设置了
AutoGenerateColumns="True"
在DataGrid上设置,这样DataTable中的所有列都将被生成。
如果DataType是类型A,则我会用DataGridTemplateColumn替换DataGridColumn。
private void DataGrid_AutoGeneratingColumn(object sender, system.Windows.Controls.DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(A))
{
e.Column = new DataGridTemplateColumn
{
CellTemplate = (DataTemplate)Resources["ATemplate"],
Header = e.Column.Header,
HeaderTemplate = e.Column.HeaderTemplate,
HeaderStringFormat = e.Column.HeaderStringFormat
};
}
}
数据模板长这样。
<DataTemplate x:Key="ATemplate">
<RadioButton Content="{Binding Name}" GroupName="{Binding GroupName}" IsChecked="{Binding IsSelected}" />
</DataTemplate>
单选按钮已经显示,但是对于所有属性我都得到了绑定错误,例如:
BindingExpression path error: 'IsSelected' property not found on 'object' ''DataRowView'
类A看起来像这样
public class A
{
public string Name { get; set; }
public string GroupName { get; set; }
public bool IsSelected { get; set; }
}
如何将DataTemplate与正确的单元格和属性进行数据绑定?
(如果您有MVVM解决方案,不必使用DataGrid_AutoGeneratingColumn,那就太好了)
编辑
我也尝试过这个解决方案,但没有成功。当无法渲染类时,仅显示单元格中的类名。
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Items}">
<DataGrid.Resources>
<DataTemplate DataType="{x:Type viewModel:A}">
<RadioButton Content="{Binding Path=Name}" GroupName="{Binding Path=GroupName}" IsChecked="{Binding Path=IsSelected}" />
</DataTemplate>
</DataGrid.Resources>
</DataGrid>