2012-07-18 68 views
0

我有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代碼中的新列?

預先感謝您。

回答

1

將數據列添加到datagrid後,請調用DataGrid的UpdateLayOut()方法。

datagrid.UpdateLayout(); 

我希望這會有所幫助。

+0

非常感謝。這就是訣竅。 – Amid 2012-07-18 17:07:39

+0

有趣的音符。如果用戶重新排序了列,他們不會在此次調用之後更改可視化樹中的順序,但它們確實改變了屏幕上的順序。 – 2012-09-06 20:50:22

0

我只是想增強解決方案, 的方法
datagrid.Items.Refresh(); 將有助於重建視圖(Datagrid的)。 因此你可以在datagrid中看到更新後的值