如何将 WPF DataGrid 绑定到可变数量的列?

2024-03-26

我的 WPF 应用程序生成的数据集每次可能具有不同的列数。输出中包含对将用于应用格式设置的每列的描述。输出的简化版本可能类似于:

class Data
{
    IList<ColumnDescription> ColumnDescriptions { get; set; }
    string[][] Rows { get; set; }
}

此类被设置为 WPF DataGrid 上的 DataContext,但我实际上以编程方式创建列:

for (int i = 0; i < data.ColumnDescriptions.Count; i++)
{
    dataGrid.Columns.Add(new DataGridTextColumn
    {
        Header = data.ColumnDescriptions[i].Name,
        Binding = new Binding(string.Format("[{0}]", i))
    });
}

有什么方法可以用 XAML 文件中的数据绑定替换此代码吗?


这是在 DataGrid 中绑定列的解决方法。由于 Columns 属性是只读的,就像每个人都注意到的那样,我创建了一个名为 BindableColumns 的附加属性,每当集合通过 CollectionChanged 事件发生更改时,它都会更新 DataGrid 中的列。

如果我们有这个 DataGridColumn 的集合

public ObservableCollection<DataGridColumn> ColumnCollection
{
    get;
    private set;
}

然后我们可以像这样将 BindableColumns 绑定到 ColumnCollection

<DataGrid Name="dataGrid"
          local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"
          AutoGenerateColumns="False"
          ...>

附加属性 BindableColumns

public class DataGridColumnsBehavior
{
    public static readonly DependencyProperty BindableColumnsProperty =
        DependencyProperty.RegisterAttached("BindableColumns",
                                            typeof(ObservableCollection<DataGridColumn>),
                                            typeof(DataGridColumnsBehavior),
                                            new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
    private static void BindableColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        DataGrid dataGrid = source as DataGrid;
        ObservableCollection<DataGridColumn> columns = e.NewValue as ObservableCollection<DataGridColumn>;
        dataGrid.Columns.Clear();
        if (columns == null)
        {
            return;
        }
        foreach (DataGridColumn column in columns)
        {
            dataGrid.Columns.Add(column);
        }
        columns.CollectionChanged += (sender, e2) =>
        {
            NotifyCollectionChangedEventArgs ne = e2 as NotifyCollectionChangedEventArgs;
            if (ne.Action == NotifyCollectionChangedAction.Reset)
            {
                dataGrid.Columns.Clear();
                foreach (DataGridColumn column in ne.NewItems)
                {
                    dataGrid.Columns.Add(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (DataGridColumn column in ne.NewItems)
                {
                    dataGrid.Columns.Add(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Move)
            {
                dataGrid.Columns.Move(ne.OldStartingIndex, ne.NewStartingIndex);
            }
            else if (ne.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (DataGridColumn column in ne.OldItems)
                {
                    dataGrid.Columns.Remove(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Replace)
            {
                dataGrid.Columns[ne.NewStartingIndex] = ne.NewItems[0] as DataGridColumn;
            }
        };
    }
    public static void SetBindableColumns(DependencyObject element, ObservableCollection<DataGridColumn> value)
    {
        element.SetValue(BindableColumnsProperty, value);
    }
    public static ObservableCollection<DataGridColumn> GetBindableColumns(DependencyObject element)
    {
        return (ObservableCollection<DataGridColumn>)element.GetValue(BindableColumnsProperty);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 WPF DataGrid 绑定到可变数量的列? 的相关文章

随机推荐

  • Microsoft.Office.Interop.Excel:如何将边框应用于一个单元格

    我希望使用 Microsoft Office Interop Excel 库将边框应用于一个单元格 我正在运行一个 while 循环 用于搜索特定列中的空单元格 一旦找到该单元格 我想对其应用边框 我知道有很多论坛使用范围 但我无法使用范围
  • 选取多个属性

    我正在尝试从 AngularJS 中的对象创建一个数组 以用于 ui bootstrap 的 typeahead 我能够从对象中提取单个值 蝙蝠侠 但我需要能够组合多个属性来创建一个新的数组元素 蝙蝠侠 韦恩 布鲁斯 我试过 scope h
  • Webapi 2.0如何在访问令牌过期时实现刷新JWT令牌

    我对 Web API 实现相当陌生 我创建了一个 Web API 服务来使用它ASP net web form应用程序以及一些独立应用程序 C 控制台 Windows应用程序 使用HttpClient object 我已经在 Web api
  • 无法从 browser.storage.local.get 提取数据

    尝试实现 Firefox 插件 扩展版本 64 0 的选项页面 我在用browser storage local set 存储数据 但是当我使用browser storage local get拉取数据 结果是
  • 在 OS X Yosemite 10.10 上安装 QuickCheck for GHC 7.8.3 时出现 Clang 错误 (14A389)

    安装时QuickCheck对于 OS X Yosemite 10 10 14A389 系统上的 Haskell GHC 7 8 3 该系统在带有 Xcode 6 1 6A1052d 的 Mac Pro 2013 上运行 我遇到以下 clan
  • 从 DataTable 中选择第二组 20 行

    我有一个 DataTable 我从 SQL 表中填充以下示例列 ID Type Value 我正在用某种类型的行填充数据表 我想从生成的 DataTable 中选择第 10 20 行 Connect conn new Connect Sql
  • 我什么时候想要恢复 Perl 6 异常?

    也许我真正的问题是 这个功能是否适合学习 Perl 6 基于这个 Perl 6 CATCH 块应该能够更改词法范围内的变量吗 https stackoverflow com q 43289842 2766176 看起来最简单的例子可能超出了
  • Ionic 2-在不同组件上带有按钮处理程序的警报对话框

    我有 ionic2 应用程序 我想使用通用警报控制器 所以我可以通过方法参数传输所有数据 在每个组件屏幕上 警报对话框按钮应单独处理 我怎样才能编写这样的警报 以便我可以根据需要处理单独组件上的按钮单击 请帮助我是 Ionic2 的新手 副
  • 如何在 hbase 中存储原始数据类型并检索

    如何使用 hbase api 存储和检索原始数据类型 我的任务是在 hbase 上保存随机事件 其中包含随机生成的不可预测的数据类型 并需要在我想要的时候取回它们 有人可以帮我解决这个问题吗 因为我对 hbase 和这些东西真的很陌生 这是
  • OptaPlanner - 实体从未添加到此 ScoreDirector 错误中

    我正在 OptaPlanner 中实现一种类似于 NurseRoster 的算法 我需要在 drools 中实施一条规则来检查是否Employee工作天数不能超过他的工作天数contract 由于我不知道如何在 drools 中实现这一点
  • 尝试嵌入小程序时出现 java.lang.NoClassDefFoundError

    所以我为我认识的一个孩子编写了贪吃蛇游戏的代码 但这个该死的东西不会将自己嵌入到 html 中 我确信该类文件与以下目录位于同一目录中snake html 但它仍然拒绝运行 它总是回复 java lang NoClassDefFoundEr
  • 如何测试使用react-spring的react组件?

    我正在尝试测试我的 SpringComponent 该组件使用反应弹簧 https www react spring io 用于动画 当我运行测试时 出现以下错误 玩笑遇到了意想不到的令牌 如果我评论我的 Spring 代码 错误就会消失并
  • 事件侦听器触发错误的目标/函数在错误的时间执行[重复]

    这个问题在这里已经有答案了 我遇到了一个事件侦听器问题 它在错误的对象上触发 要查看它 请单击 Min 下方数字的一个 td 完整的js代码如下 var minedit document getElementsByClassName min
  • Android Sqlite 问题

    我正在尝试实现一个在以下位置找到的 SQLite 示例安卓10 http www android10 org index php articlesdatastorage 235 creating and using databases in
  • 如何使用一个简单的命令将大量变量附加到一个变量

    我想将所有变量粘贴到一个变量中 A blah AA blah2 AAA blah3 AAB blah4 AAC blah5 lets pretend theres 100 more of these Variable composition
  • Google App Engine 中通道池的最佳方法

    似乎使 GAE Channel API 在财务上可行的唯一方法是实施某种池化机制 当我向他们发送有关过高价格的电子邮件时 一位高级应用程序引擎产品经理甚至告诉我这一点 以重用尚未使用的渠道已到期 我一直在集思广益地讨论实现通道池的方法 地点
  • 如何使用 JMeter 将 application/x-www-form-urlencoded 参数发送到 RestServer?

    我开发了一个休息服务器 并将其在本地主机中运行 我尝试使用 JMeter 执行测试 发送请求帖子和获取 取决于调用的方法 我已经发送到 Rest 服务器并使用 JMeter 在简单的 post 请求 获取请求 通过 post 发送文件以及通
  • 活动目录与 OpenLDAP

    LDAP 协议的这两种实现之间的主要区别是什么 异构环境哪个更好 关于这个主题有什么好的网站吗 以下是我立即知道的一些差异 OpenLDAP 可以称为通用 LDAP 服务器 类似于许多其他供应商的 LDAP 服务器 Fedora DS 38
  • Pandas 替换所有列名称中的一个字符

    我的数据框的列名称 来自 csv 文件 包含 and 我想将它们替换为 我怎样才能对所有列进行此操作 Use str replace http pandas pydata org pandas docs stable generated p
  • 如何将 WPF DataGrid 绑定到可变数量的列?

    我的 WPF 应用程序生成的数据集每次可能具有不同的列数 输出中包含对将用于应用格式设置的每列的描述 输出的简化版本可能类似于 class Data IList