2012-07-18 3 views
0

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

문제는 내가 그리드에 열을 추가 한 후 헤더가 아직 생성되지 않고는 시각적 트리에 존재하지 않는 것입니다 :이 새 열을 추가하는 코드입니다. 따라서 새 열의 헤더를 가져 오지 말고 그것에 adorner를 적용합니다. 그리드의 시각적 트리에서 행운없이 재귀 적으로 ApplyTemplate을 호출하려고했습니다.

코드에서 새 열에 대해 DataGridColumnHeader를 생성하도록 그리드를 강제로 설정할 수있는 방법이 있습니까?

미리 감사드립니다.

답변

1

DataGrid에 열을 추가 한 후 DataGrid의 UpdateLayOut() 메서드를 호출하십시오.

datagrid.UpdateLayout(); 

이 정보가 도움이되기를 바랍니다.

+0

대단히 감사합니다. 그것은 트릭을 만들었다. – Amid

+0

흥미로운 메모. 사용자가 열을 재정렬 한 경우 호출 후 시각적 트리에서 순서가 변경되지 않지만 화면에서 순서가 변경됩니다. –

0

난 그냥 솔루션을 강화하고자, 방법
datagrid.Items.Refresh(); 의지 뷰 (에서 Datagrid를) 다시하는 데 도움이됩니다. 따라서 DataGrid에서 업데이트 된 값을 볼 수 있습니다.

관련 문제