代码之家  ›  专栏  ›  技术社区  ›  ChrisF

尽管正在设置DataContext,但未设置我的WPF工具箱DataGrid上的Columns属性

  •  0
  • ChrisF  · 技术社区  · 16 年前

    我使用反射创建了一个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等属性。

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

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

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

    编辑:

    我已经将代码移动到autogeneratedcolumns事件处理程序(它似乎被调用了两次),只要我检查列就行。count我可以访问数据。

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

    我的代码是:

    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 回复  |  直到 16 年前
        1
  •  2
  •   Daniel Pratt    16 年前

    我知道您想控制自动生成列的可见性吗?我认为DataGrid的AutoGeneratingColumn事件非常适合这样做。它为每个自动生成的列触发一次。此时可以修改列的属性(如设置可见性)或执行以下操作 e.Cancel = true 以防止创建该列 完全 .

        2
  •  0
  •   ChrisF    15 年前

    我意识到我所看到的行为是正确的,我只能在丹尼尔的回答指引我正确的方向(即使不是100%正确)之后才能进入专栏。然而,这导致了随后的问题,即试图同时设置可见性和显示索引。

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

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

    你可以试着解决这个问题 通过调用Dispatcher.BeginInvoke 加载后的 事件。问题似乎是这样的 订单更改时不发生 当页面达到稳定后 状态。

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

    更新

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

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