2013-04-09 59 views
2

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

回答

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

太棒了!我不确定是否可以用新的'DataGridCheckBoxColumn'来替换生成的。 – 2013-04-10 02:51:17

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得到属性类型 - 和 基于它所通用的决定 - 这几乎是你所需要的 我想,我还没有尝试过,虽然。所以你必须尝试一下。

+0

好的解决方案,但更喜欢另一个,因为我们根本不使用MVVM),并且因为解决方案可以在DataGrid级别实现(具有高度定制的DataGrid控件并且可以在那里实现),而不是模型视图应该在应用程序的所有'Datagrid's中默认实现,而不必在每个视图中实现。 – 2013-04-10 02:54:45