0

このコードを使用して、データグリッドから列を追加または削除します。各列ヘッダーには、マウスの入力と終了イベントがあります。新しい列については、データグリッドに挿入した後に同じイベント ハンドラーを追加したいと思います。

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

<編集>

データグリッドヘルパー

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 を返します。

助けてください。

ありがとうディー

4

2 に答える 2

0

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

myDataGrid.Loaded += (s,e) => {
    myCollection.CollectionChanged += (se, ev) => {
        //do work here
    };
};
于 2012-05-07T05:52:40.230 に答える
0

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

于 2012-05-06T22:41:35.280 に答える