3

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

4

2 回答 2

9

您应该注册到 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;
           }
    }
于 2013-04-09T16:23:49.963 回答
0

您必须尝试一下-我不在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来获取属性类型-并根据它做出通用决定-我认为这几乎是您所需要的,但我还没有尝试过。所以你必须尝试一下。

于 2013-04-09T16:40:14.720 回答