C# WPF DataGrid在为可空布尔自动生成列时强制绑定DataGridCheckBoxColumn

C# WPF DataGrid在为可空布尔自动生成列时强制绑定DataGridCheckBoxColumn,c#,.net,wpf,datagrid,C#,.net,Wpf,Datagrid,我们有很多带有动态数据绑定的DataGrid,所以我们总是使用AutoGenerateColumns=True。对于bool列,生成一个DataGridCheckBoxColumn,但对于可为空的bool(bool?在C#中),生成默认的DataGridTextColumn。有没有办法强制DataGrid为可空bool自动生成DataGridCheckBoxColumn?不喜欢依赖于实现的黑客。此外,一些代码隐藏也被接受,例如在自动生成列事件中。您应该注册到自动生成列事件,并根据列类型更改生成的

我们有很多带有动态数据绑定的
DataGrid
,所以我们总是使用
AutoGenerateColumns=True
。对于
bool
列,生成一个
DataGridCheckBoxColumn
,但对于可为空的bool(
bool?
在C#中),生成默认的
DataGridTextColumn
。有没有办法强制
DataGrid
为可空bool自动生成
DataGridCheckBoxColumn
?不喜欢依赖于实现的黑客。此外,一些代码隐藏也被接受,例如在
自动生成列
事件中。

您应该注册到自动生成列事件,并根据列类型更改生成的列,如下所示:

  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;
           }
    }

你必须尝试一下-我不在VS附近-但你应该能够使用它来轻松解决它

看看我的另一篇帖子

使用该“方法”将绑定到您的命令
(一切都是MVVM直截了当的-您只需要一个
autogenerateClumnEvent
附加属性

然后在您的命令处理中,就像我在那里做的那样-替换列-就像已经建议的那样

1) 使用提供的
Attach
类,添加名称空间等

(二) 在你的XAML中

<DataGrid 
    local:Attach.AutoGenerateColumnEvent="{Binding AutoGeneratingColumnCommand}" AutoGenerateColumns="True" />  
注意:对于更通用的解决方案…

您可以使用
PropertyDescriptor
获取属性类型和 根据它做出一般性的决定——这正是你所需要的 我想,我还没试过。所以你得试试


伟大的我不确定是否可以简单地用一个新的
DataGridCheckBoxColumn
替换生成的一个。这是一个好的解决方案,但更喜欢另一个,因为我们根本不使用MVVM:),而且解决方案可以在
DataGrid
级别实现(可以有一个高度定制的
DataGrid
控件,并且可以在那里实现),不是视图的模型,因为默认情况下应该在应用程序的所有
Datagrid
s中实现,而不必在每个视图中实现。
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)); 
    } 
}