我有WPF窗体与DataGrid。用户可以通过按钮手动将新列添加到数据网格中。这是添加新列代码:如何强制DataGrid重建VisualTree的列
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,但没有任何运气。
有什么办法强制网格生成DataGridColumnHeader代码中的新列?
预先感谢您。
非常感谢。这就是诀窍。 – Amid 2012-07-18 17:07:39
有趣的音符。如果用户重新排序了列,他们不会在此次调用之后更改可视化树中的顺序,但它们确实改变了屏幕上的顺序。 – 2012-09-06 20:50:22