2012-05-06 64 views
0

我使用此代碼向datagrid添加或刪除列。每個列標題我有鼠標進入和離開事件。對於新列,我也想在插入到datagrid後添加相同的事件處理程序。Datagrid Column Collection更改事件

private void Columns_CollectionChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e) 
    { 
     if (e.Action == CollectionChangeAction.Add) 
     { 
      int columnPosition = (this.Columns.Count - 1); 
      DataGridTextColumn column = new DataGridTextColumn(); 
      column.Header = (e.Element as DataColumn).ColumnName; 
      column.Binding = new Binding(string.Format("[{0}]", column.Header.ToString())); 
      this.Columns.Insert(columnPosition, column); 

      DataGridColumnHeader columnHeader = DataGridHelper.GetColumnHeader(this, columnPosition); 
      if (columnHeader != null) 
      { 
       columnHeader.MouseEnter += new MouseEventHandler(ColumnHeader_MouseEnter); 
       columnHeader.MouseLeave += new MouseEventHandler(ColumnHeader_MouseLeave); 
      } 
      SetAutomappingOnOff = false; 
     } 
     else if (e.Action == CollectionChangeAction.Remove) 
     { 
      DataColumn column = e.Element as DataColumn; 
      DataGridColumn toRemove = (from DataGridColumn dc in this.Columns 
             where dc.Header != null && dc.Header.ToString() == column.ColumnName 
             select dc).First(); 
      this.Columns.Remove(toRemove); 
      SetAutomappingOnOff = false; 
     } 
    } 

<編輯>

DataGridHelper

public static class DataGridHelper 
{ 
    public static DataGridColumnHeader GetColumnHeader(DataGrid dataGrid, int index) 
    { 
     DataGridColumnHeadersPresenter presenter = FindVisualChild<DataGridColumnHeadersPresenter>(dataGrid); 
     if (presenter != null) { 
      return (DataGridColumnHeader)presenter.ItemContainerGenerator.ContainerFromIndex(index)‌​; 
     } 
     return null; 
    } 
} 

< /編輯>

不過的columnHeader始終返回null,即使我可以看到該對象被創建並添加到datagrid。

請幫我。

感謝 迪

+0

什麼是DataGridHelper,它是如何獲得列標題的? –

+0

公共靜態類DataGridHelper { 公共靜態DataGridColumnHeader GetColumnHeader(數據網格的數據網格,INT指數) { DataGridColumnHeadersPresenter演示= FindVisualChild (的數據網格); if(presenter!= null) { return(DataGridColumnHeader)presenter.ItemContainerGenerator.ContainerFromIndex(index); } return null; }} –

回答

0

雖然列添加到DataGrid,它尚未加入的VisualTree所以你FindVisualChild方法返回null。我沒有爲列添加單擊處理程序的良好解決方案,但可以將其添加到DataGrid並檢查發件人以查看應用點擊處理邏輯的位置。

0

我建議在DataGrid -s Loaded事件上註冊CollectionChanged事件。這樣你可以確定DataGridColumnHeader被添加到可視化樹中。它看起來像這樣:

myDataGrid.Loaded += (s,e) => { 
    myCollection.CollectionChanged += (se, ev) => { 
     //do work here 
    }; 
};