Question

Code Ma est comme suit:

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

        }
    }

J'ai besoin DataGridColumnHeader de la colonne. Où vais-je tort?

Était-ce utile?

La solution

L'objet en-tête de l'DataGridColumn est en fait l'en-tête visible de cette colonne, tout ce que vous définissez soit. DataGridColumn ne fait pas partie de l'arborescence visuelle donc il n'y a pas de façon directe pour accéder au DataGridColumnHeader pour (nous ne pouvons même pas être sûr qu'il existe encore). Mais vous pouvez faire quelque chose comme ça pour essayer d'y accéder

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

Autres conseils

Alors que réponse de Fredrik propose une approche refactorisé avec méthode supplémentaire qui pourrait être réutilisé dans d'autres parties du code, je préféré consolider ses méthodes pour une méthode unique. Il peut aussi y avoir un petit gain de performance car il peut mettre fin à la recherche dès qu'il trouve l'en-tête et il n'a pas besoin de continuer à chercher par tous les enfants dans l'arborescence visuelle (ce qui est très probablement négligeable pour la plupart des cas).

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

Et il est utilisé comme ceci:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top