C# 我的WPF工具包DataGrid上的Columns属性为';尽管已设置DataContext,但仍无法设置

C# 我的WPF工具包DataGrid上的Columns属性为';尽管已设置DataContext,但仍无法设置,c#,datagrid,wpftoolkit,C#,Datagrid,Wpftoolkit,我已使用反射创建了一个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; foreac

我已使用反射创建了一个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包含标题、艺术家、比特率、HasImage等属性

我试图在DataTable充满数据之前设置DataGrid中某些列的可见性。但是,dataGridView.Columns属性为空。如果我等到DataTable被填充之后,那么就会设置dataGridView.Columns属性

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

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

编辑:

我已经将代码移动到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);
}

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

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

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

这确实是一个bug,我们已经 在我们的数据库中提交了一个bug来跟踪 这个问题

你可以试着解决这个问题 通过调用Dispatcher.BeginInvoke 已加载文件中的后台优先级 事件看来问题确实如此 如果订单更改,则不会发生 在页面达到稳定状态后 国家

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

更新

我使用的是3.5.40320.1版,标签为2009年3月


我刚刚更新到版本3.5.40619.1,标签为2009年6月,设置可见性和显示索引的问题已经解决。

Yes-DataGrid上的列是根据DataTable中的列自动创建的。我将调查使用AutoGeneratedColumns事件实际需要的AutoGeneratedColumns事件。这实际上是两次提出,所以我需要检查列。在尝试访问数据之前计数。我接受我自己的答案,因为它解释了当前的位置。