当autogeneratecolcolumns为空bool时,WPF DataGrid强制绑定DataGridCheck

本文关键字:DataGrid 绑定 DataGridCheck WPF autogeneratecolcolumns 为空 bool | 更新日期: 2023-09-27 18:08:10

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

当autogeneratecolcolumns为空bool时,WPF DataGrid强制绑定DataGridCheck

您应该注册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;
           }
    }

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

看我的另一个帖子
如何在AutoGenerateColumns设置为True时停止在DataGrid中生成的特定列?

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 获取属性类型- and在此基础上做一个一般性的决定——这就是你所需要的我想我还没试过。所以你得试一下。