Como llegar DataGridColumnHeader de DataGridColumn?
-
26-09-2019 - |
Pregunta
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
de la columna. ¿Dónde voy mal?
Solución
El objeto de la cabecera DataGridColumn es en realidad la cabecera visible de esa columna, lo que establece que sea. DataGridColumn no es parte del árbol visual así que no hay forma directa de acceso al DataGridColumnHeader para él (que ni siquiera podemos estar seguros de que todavía existe). Pero se puede hacer algo como esto para tratar de acceder a ella
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);
}
}
}
Otros consejos
Si bien la respuesta de Fredrik proporciona un enfoque refactorizado con método adicional que potencialmente podrían ser reutilizados en otras partes del código, preferido para consolidar sus métodos en a un solo método. También puede haber alguna pequeña ganancia de rendimiento, ya que puede poner fin a la búsqueda tan pronto como se encuentra la cabecera y que no tiene que seguir buscando a través de todos los niños en el árbol visual (lo más probable es insignificante para 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 utiliza de esta manera:
DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }