2012-05-06 13 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; 
    } 
} 

< /編集>

しかし、列ヘッダは、常に私は、そのオブジェクトが作成され、追加され見ることができるにもかかわらず、nullを返します。データグリッド。

Pls help me。

おかげ ディー

+0

どのようなデータグリッドヘルパーですか、どのようにして列見出しを取得しますか? –

+0

パブリック静的クラスDataGridHelper {パブリック静的DataGridColumnHeader GetColumnHeader(データグリッドデータグリッド、INTインデックス) {DataGridColumnHeadersPresenterプレゼンタ= FindVisualChild (データグリッド)。 (発表者!= null) } return null; }} –

答えて

0

列には、データグリッドに追加されているが、あなたのFindVisualChildメソッドがnullを返しているので、それはまだVisualTreeに追加されていません。私は列のクリックハンドラを追加するための良い解決策はありませんが、DataGridにそれを追加し、送信者がクリック処理ロジックをどこに適用するかを確認することができます。

0

CollectionChangedイベントをDataGrid -s Loadedイベントに登録することをお勧めします。そうすれば、DataGridColumnHeaderがビジュアルツリーに確実に追加されます。これは次のようになります。

myDataGrid.Loaded += (s,e) => { 
    myCollection.CollectionChanged += (se, ev) => { 
     //do work here 
    }; 
}; 
関連する問題