Как заставить DataGrid перестроить VisualTree для его столбцов

У меня есть форма WPF с DataGrid. Новые столбцы могут быть добавлены в таблицу данных вручную пользователем с помощью кнопки. Это код для добавления нового столбца:

        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 для нового столбца в коде?

Заранее спасибо.

2 ответа

Решение

Привет после добавления столбцов в datagrid, вызовите метод UpdateLayOut() DataGrid.

datagrid.UpdateLayout();

Я надеюсь, это поможет.

Я просто хочу улучшить решение, метод
datagrid.Items.Refresh();Поможет воссоздать вид (Датагрид). Таким образом, вы можете увидеть обновленное значение в сетке данных

Другие вопросы по тегам