【问题标题】:How to force DataGrid to rebuild VisualTree for its columns如何强制 DataGrid 为其列重建 VisualTree
【发布时间】:2012-07-18 15:21:57
【问题描述】:

我有带有 DataGrid 的 WPF 表单。用户可以通过按钮手动将新列添加到数据网格中。这是添加新列的代码:

        private void ColumnAdornerAddButton_MouseDown(object sender, MouseButtonEventArgs e)
    {
        DataGridTextAdornerColumn column = new DataGridTextAdornerColumn();
        column.Header = "New column";
        column.HeaderStyle = (Style)FindResource("columnHeader");
        column.AdornerTemplate = (DataTemplate)FindResource("columnAdorner");
        Binding binding = new Binding("Data");
        binding.Mode = BindingMode.TwoWay;
        column.Binding = binding;

        grid.Columns.Insert(grid.Columns.Count - 1, column);

        //Add adorner
        DataGridColumnHeader header = GetColumnHeaderFromColumn(column);
        AddAdorner(header, column.AdornerTemplate, column.IsReadOnly);
    }

    private DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn column)
    {
        // dataGrid is the name of your DataGrid. In this case Name="dataGrid" 
        List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(grid);
        foreach (DataGridColumnHeader columnHeader in columnHeaders)
        {
            if (columnHeader.Column == column)
            {
                return columnHeader;
            }
        }
        return null;
    }

问题是,在我将列添加到网格后,它的标题尚未生成,并且它不存在于可视树中。因此,我无法获取新列的标题并将装饰器应用于它。 我试图在网格的可视化树上递归调用 ApplyTemplate,但没有任何运气。

有什么办法可以强制grid在代码中为新列生成DataGridColumnHeader?

提前谢谢你。

【问题讨论】:

    标签: wpf datagrid visual-tree datagridcolumnheader


    【解决方案1】:

    你好,添加列到datagrid后调用DataGrid的UpdateLayOut()方法。

    datagrid.UpdateLayout();
    

    我希望这会有所帮助。

    【讨论】:

    • 有趣的笔记。如果用户对列进行了重新排序,则在此调用后他们不会更改可视树中的顺序,但会更改屏幕上的顺序。
    【解决方案2】:

    我只是想增强解决方案, 方法
    datagrid.Items.Refresh(); 将有助于重新创建视图(Datagrid)。 因此您可以在 datagrid 中看到更新后的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多