Pergunta

Meu código é o seguinte:

 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!!!

        }
    }

Eu preciso de DataGridColumnHeader da coluna. Onde eu estou errando?

Foi útil?

Solução

O objeto de cabeçalho da DataGridColumn é na verdade o cabeçalho visível dessa coluna, seja qual for o que você o definir. O DataGridColumn não faz parte da árvore visual, portanto não há uma maneira direta de acessar o DataGridColumnHeader (não podemos ter certeza de que ainda existe). Mas você pode fazer algo assim para tentar acessar

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

Outras dicas

Enquanto Resposta de Fredrik Fornece uma abordagem refatória com método adicional que poderia ser reutilizado em outras partes do código, eu preferi consolidar seus métodos em um único método. Também pode haver um pequeno ganho de desempenho, pois pode encerrar a pesquisa assim que encontrar o cabeçalho e não precisa continuar pesquisando todas as crianças na árvore visual (isso provavelmente é insignificante para a maioria dos 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;
}

E é usado assim:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top