Wpf Datagrid列集合已更改事件
我使用此代码从datagrid中添加或删除列。每个列标题我都有鼠标进入和离开事件。对于新列,我还希望在插入到datagrid之后添加相同的事件处理程序Wpf Datagrid列集合已更改事件,wpf,datagrid,add,Wpf,Datagrid,Add,我使用此代码从datagrid中添加或删除列。每个列标题我都有鼠标进入和离开事件。对于新列,我还希望在插入到datagrid之后添加相同的事件处理程序 private void Columns_CollectionChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e) { if (e.Action == CollectionChangeAction.Add)
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;
}
}
公共静态类DataGridHelper
{
公共静态DataGridColumnHeader GetColumnHeader(DataGrid DataGrid,int index)
{
DataGridColumnHeadersPresenter-presenter=FindVisualChild(dataGrid);
如果(演示者!=null){
return(DataGridColumnHeader)presenter.ItemContainerGenerator.ContainerFromIndex(索引);
}
返回null;
}
}
但columnHeader总是返回null,即使我可以看到对象被创建并添加到datagrid
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;
}
}
请帮帮我
谢谢
Dee列已添加到数据网格,但尚未添加到VisualTree,因此FindVisualChild方法返回null。我没有为列添加单击处理程序的好解决方案,但您可以将其添加到DataGrid,并检查发送方以查看在何处应用单击处理逻辑。我建议在
DataGrid
-s加载的事件上注册CollectionChanged
事件。这样,您可以确保将DataGridColumnHeader
添加到可视化树中。它将如下所示:
myDataGrid.Loaded += (s,e) => {
myCollection.CollectionChanged += (se, ev) => {
//do work here
};
};
什么是DataGridHelper及其如何获取列标题?公共静态类DataGridHelper{public static DataGridColumnHeader GetColumnHeader(DataGrid DataGrid,int index){DataGridColumnHeadersPresenter presenter=FindVisualChild(DataGrid);if(presenter!=null){return(DataGridColumnHeader)presenter.ItemContainerGenerator.ContainerFromIndex(index);}return null;}}