我们有很多DataGrid
动态数据绑定,所以我们总是使用AutoGenerateColumns=True
。对于bool
列,会生成DataGridCheckBoxColumn
,但对于可以为空的bool(C#中的bool?
),会生成默认的DataGridTextColumn
。有没有办法强制DataGrid
自动生成DataGridCheckBoxColumn
可空的bool?不喜欢依赖于实现的黑客攻击。此外,例如在AutoGeneratingColumn
事件中也接受了一些代码隐藏。
答案 0 :(得分:8)
您应该注册到AutoGeneratingColumn事件并根据列类型更改生成的列,如下所示:
private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(bool?))
{
DataGridCheckBoxColumn checkBoxColumn=new DataGridCheckBoxColumn();
checkBoxColumn.Header = e.Column.Header;
checkBoxColumn.Binding = new Binding(e.PropertyName);
checkBoxColumn.IsThreeState = true;
// Replace the auto-generated column with the checkBoxColumn.
e.Column = checkBoxColumn;
}
}
答案 1 :(得分:0)
你必须尝试一下 - 我不在VS附近 - 但你应该能够用它来轻松解决它......
看看我的另一篇文章 ...
how to stop a specific column to be generated in DataGrid when the AutoGenerateColumns is set to True?
对您的命令使用{方法'bind
(所有都是MVVM直接 - 你只需要一个AutoGenerateColumnEvent
附加属性。
然后在你的命令处理中,就像我在那里做的那样 - 替换列 - 就像已经建议的那样。
1)使用提供的Attach
类,添加命名空间等。
2) 在你的XAML ......
<DataGrid
local:Attach.AutoGenerateColumnEvent="{Binding AutoGeneratingColumnCommand}" AutoGenerateColumns="True" />
3) 在您的视图模型中......
RelayCommand _autoGeneratingColumnCommand;
public RelayCommand AutoGeneratingColumnCommand
{
get
{
return _autoGeneratingColumnCommand ?? (_autoGeneratingColumnCommand = new RelayCommand(param =>
{
var e = param as DataGridAutoGeneratingColumnEventArgs;
var type = ((PropertyDescriptor)e.PropertyDescriptor).PropertyType;
if (type == typeof(bool?))
e.Column = new DataGridCheckBoxColumn();
},
param => true));
}
}
注意:有关更通用的解决方案......
您可以使用
PropertyDescriptor
获取属性类型 - 和 根据它做出一般的决定 - 这几乎就是你所需要的 我想,我没有尝试过。所以你必须尝试一下。