【问题标题】:The Columns property on my WPF Toolkit DataGrid isn't set despite the DataContext being set尽管设置了 DataContext,但未设置我的 WPF Toolkit DataGrid 上的 Columns 属性
【发布时间】:2009-04-09 13:47:04
【问题描述】:

我使用反射创建了一个 DataTable 以从我的类中获取属性并将其设置为我的 Microsoft.Windows.Controls.DataGrid 的 DataContext:

// Create the columns based on the data in the album info - get by reflection
var ai = new AlbumInfo();
Type t = ai.GetType();

dataTable.TableName = t.Name;

foreach (PropertyInfo p in t.GetProperties())
{
    var columnSpec = new DataColumn();
    // If boolean or int type can create directly into grid, else create a text box
    if (p.PropertyType == typeof(bool) || p.PropertyType == typeof(int))
    {
        columnSpec.DataType = p.PropertyType;
    }
    else
    {
        columnSpec.DataType = typeof(string);
    }
    columnSpec.ColumnName = p.Name;
    dataTable.Columns.Add(columnSpec);
}

dataGridView.DataContext = dataTable;

AlbumInfo 包含 Title、Artist、BitRate、HasImage 等属性。

我正在尝试在 DataTable 填充数据之前设置 DataGrid 中某些列的可见性。但是,dataGridView.Columns 属性为空。如果我等到填充 DataTable 之后,则设置 dataGridView.Columns 属性。

DataTable.Columns 属性在表格填充之前设置。

在将 DataTable 绑定到 DataGrid 时,我还需要做什么吗?我无法在 XAML 中执行任何操作,因为我正在通过反射动态构建 DataTable。

编辑:

我已将代码移至 AutoGeneratedColumns 事件处理程序(它似乎被调用了两次),因此只要检查 Columns.Count 我就可以访问数据。

但是,我可以设置列可见性或显示索引 - 但不能同时设置。如果我尝试同时执行这两项操作,我会在 WPFToolkit DataGrid 代码的其他地方得到一个超出范围异常的索引。有人知道为什么吗?

我的代码是:

foreach (object columnData in Properties.Settings.Default.ColumnData)
{
    DataGridColumn column = dataGridView.Columns[index];
    column.DisplayIndex = columnData.DisplayIndex;
    column.Visibility = columnData.Visible ? Visibility.Visible : Visibility.Hidden;

    AddContextMenuItem(dataGridView.ContextMenu, columnData.Header, index++, columnData.Visible);
}

AddContextMenuItem 是我的方法之一:

private void AddContextMenuItem(ContextMenu contextMenu, string columnName, int index, bool visible)
{
    var menuItem = new MenuItem() { Header = columnName, Tag = index, IsCheckable = true, IsChecked = visible };
    menuItem.Click += new RoutedEventHandler(contextMenu_onClick);
    contextMenu.Items.Add(menuItem);
}

【问题讨论】:

    标签: c# datagrid wpftoolkit


    【解决方案1】:

    我了解您想要控制自动生成的列的可见性吗?我认为 DataGrid 的 AutoGeneratingColumn 事件将是完美的。它为每个自动生成的列触发一次。此时您可以修改列的属性(例如设置可见性)或执行e.Cancel = true 以防止创建该列

    【讨论】:

    • 是 - DataGrid 上的列是从 DataTable 中的列自动创建的。我将调查 AutoGeneratingColumn 事件
    • 我实际上需要使用 AutoGeneratedColumns 事件。这实际上引发了两次,所以我需要在尝试访问数据之前检查 Columns.Count。
    【解决方案2】:

    我意识到我看到的行为是正确的,我只能在 Daniel 的回答指出我正确的方向后才能访问这些列(即使它不是 100% 正确)。然而,这导致了尝试设置可见性和显示索引的后续问题。

    我在 Codeplex 讨论板上报告了无法同时设置显示索引和可见性的问题,并且刚刚收到此回复:

    这确实是一个错误,我们已经 在我们的数据库中提交了一个错误以进行跟踪 问题。

    您可以尝试解决此问题 通过调用 Dispatcher.BeginInvoke 在 Loaded 中的背景优先级 事件。看来这个问题确实 如果订单更改则不会发生 页面达到稳定后 状态。

    我不确定是否会检查此解决方法。我在 WPF 中重写了一个 WinForms 应用程序作为学习练习,而这项工作并不是真正重要的。

    更新

    我使用的是 3.5.40320.1 版本,标记为 2009 年 3 月。

    我刚刚更新到版本 3.5.40619.1,标记为 2009 年 6 月,设置可见性和显示索引的问题已得到修复。

    【讨论】:

    • 我接受我自己的回答,因为它解释了当前的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2019-07-25
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多