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?

¿Fue útil?

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 */ }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top