【问题标题】:WPF DataGrid force binding DataGridCheckBoxColumn when AutoGenerateColumns for nullable bool当 AutoGenerateColumns for nullable bool 时 WPF DataGrid 强制绑定 DataGridCheckBoxColumn
【发布时间】:2013-04-09 15:39:08
【问题描述】:

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

【问题讨论】:

    标签: c# .net wpf datagrid


    【解决方案1】:

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

    【讨论】:

    • 太棒了!我不确定是否可以简单地将生成的替换为新的DataGridCheckBoxColumn
    【解决方案2】:

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

    【讨论】:

    • 好的解决方案,但更喜欢另一个,因为我们根本不使用 MVVM :) 并且因为该解决方案可以在 DataGrid 级别实现(有一个高度定制的 DataGridcontrol 并且可以在那里实现),而不是应该在应用程序的所有Datagrids 中默认实现的视图模型,而不必在每个视图中实现。
    猜你喜欢
    • 2018-06-20
    • 2015-08-07
    • 1970-01-01
    • 2011-09-27
    • 2012-03-21
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多