当AutoGenerateColumns为可空的bool时,WPF DataGrid强制绑定DataGridCheckBoxColumn

时间:2013-04-09 15:39:08

标签: c# .net wpf datagrid

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

2 个答案:

答案 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 获取属性类型 - 和   根据它做出一般的决定 - 这几乎就是你所需要的   我想,我没有尝试过。所以你必须尝试一下。