wpf datagrid header datagridcolumn

wpf - ¿Cómo obtener DataGridColumnHeader de DataGridColumn?



(2)

Mi código es el siguiente ::::

void mainDataContextObj_CutSelectedColumnEvent(string columnId) { IList<DataGridColumn> columns = dg.Columns; for(int i=2; i<dg.Columns.Count; i++) { DataGridColumnHeader headerObj = dg.Columns[i].Header as DataGridColumnHeader; //This always returns headerObj as null!!! } }

Necesito DataGridColumnHeader desde la columna. ¿Dónde me estoy equivocando? ¡¡Por favor ayuda!!


El objeto Encabezado de DataGridColumn es en realidad el encabezado visible de esa columna, sea lo que sea que hayas configurado. DataGridColumn no es parte del Árbol visual, por lo que no hay forma directa de acceder al DataGridColumnHeader para él (ni siquiera podemos estar seguros de que aún exista). Pero puedes hacer algo como esto para intentar acceder a él

DataGridColumnHeader headerObj = GetColumnHeaderFromColumn(column); private DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn column) { // dataGrid is the name of your DataGrid. In this case Name="dataGrid" List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(dataGrid); foreach (DataGridColumnHeader columnHeader in columnHeaders) { if (columnHeader.Column == column) { return columnHeader; } } return null; } public List<T> GetVisualChildCollection<T>(object parent) where T : Visual { List<T> visualCollection = new List<T>(); GetVisualChildCollection(parent as DependencyObject, visualCollection); return visualCollection; } private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual { int count = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < count; i++) { DependencyObject child = VisualTreeHelper.GetChild(parent, i); if (child is T) { visualCollection.Add(child as T); } else if (child != null) { GetVisualChildCollection(child, visualCollection); } } }


Si bien la respuesta de Fredrik proporciona un enfoque refactorizado con un método adicional que podría reutilizarse en otras partes del código, prefiero consolidar sus métodos en un único método. También puede haber una pequeña ganancia en el rendimiento porque puede finalizar la búsqueda tan pronto como encuentre el encabezado y no necesite continuar buscando entre todos los elementos secundarios en el árbol visual (esto es muy poco significativo en la mayoría de los casos).

private DataGridColumnHeader GetHeader(DataGridColumn column, DependencyObject reference) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(reference); i++) { DependencyObject child = VisualTreeHelper.GetChild(reference, i); DataGridColumnHeader colHeader = child as DataGridColumnHeader; if ((colHeader != null) && (colHeader.Column == column)) { return colHeader; } colHeader = GetHeader(column, child); if (colHeader != null) { return colHeader; } } return null; }

Y se usa así:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid); if (colHeader == null) { /* Not found */ }