如何强制DataGrid为其列重建VisualTree [英] How to force DataGrid to rebuild VisualTree for its columns

查看:136
本文介绍了如何强制DataGrid为其列重建VisualTree的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有WPF表单与DataGrid。用户可以通过按钮手动添加新的列。这是添加新列的代码:

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

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

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

私有DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn列)
{
// dataGrid是您的DataGrid的名称。在这种情况下,Name =dataGrid
列表< DataGridColumnHeader> columnHeaders = GetVisualChildCollection< DataGridColumnHeader>(grid);
foreach(columnHeader中的DataGridColumnHeader columnHeader)
{
if(columnHeader.Column == column)
{
return columnHeader;
}
}
返回null;
}

问题是,在我将列添加到网格后,其标题是还没生成,它不存在于视觉树中。因此,我不能得到新列的标题,并应用adorner。
我试图在Grid的视觉树上递归调用ApplyTemplate,没有任何运气。



有没有办法强制网格为新列生成DataGridColumnHeader在代码中?



提前谢谢。

解决方案

添加列到datagrid调用DataGrid的UpdateLayOut()方法。

  datagrid.UpdateLayout(); 

我希望这将有所帮助。


I have WPF form with DataGrid. New columns can be added to the datagrid manually by user via button. This is the code to add new column:

        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;
    }

The problem is that after I have added the column to the grid its header is not yet generated and it is not present in visual tree. Thus I cant get header for the new column and apply adorner to it. I have tried to call ApplyTemplate recursively on visual tree of the grid without any luck.

Is there any way to force grid to generate DataGridColumnHeader for the new column in code?

Thank you in advance.

解决方案

Hi after adding columns to datagrid call the method UpdateLayOut() of DataGrid.

datagrid.UpdateLayout();

I hope this will help.

这篇关于如何强制DataGrid为其列重建VisualTree的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆