尽管设置了DataContext,但我的WPF Toolkit DataGrid上的Columns属性未设置

时间:2009-04-09 13:47:04

标签: 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;

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属性为null。如果我等到填充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);
}

2 个答案:

答案 0 :(得分:2)

我是否理解您要控制自动生成列的可见性?我认为DataGrid的AutoGeneratingColumn事件对此非常完美。它会为每个自动生成的列触发一次。您可以在此时修改列的属性(例如设置“可见性”)或执行e.Cancel = true以防止在所有中创建该列

答案 1 :(得分:0)

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

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

  

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

     

您可以尝试解决此问题   通过调用Dispatcher.BeginInvoke来   加载中的后台优先级   事件。似乎问题确实如此   如果订单被更改,则不会发生   页面达到稳定后   状态。

我不确定我是否会检查这种解决方法。我正在重写WPF中的WinForms应用程序作为学习练习,并且这项工作对此并不是必不可少的。

<强>更新

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

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