Domanda

Il mio codice è il seguente:

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

        }
    }

Ho bisogno DataGridColumnHeader dalla colonna. Dove sto andando male?

È stato utile?

Soluzione

L'oggetto intestazione della DataGridColumn è in realtà l'intestazione visibile di quella colonna, qualunque cosa si imposta che sia. DataGridColumn non fa parte del Visual albero, quindi non c'è modo diretto per l'accesso alla DataGridColumnHeader per esso (non possiamo neppure essere sicuri che esista ancora). Ma si può fare qualcosa di simile per cercare di accedervi

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

Altri suggerimenti

Mentre la risposta di Fredrik fornisce un approccio refactoring con metodo aggiuntivo che potrebbe potenzialmente essere riutilizzato in altre parti del codice, I preferito consolidare i suoi metodi per un unico metodo. Ci possono essere anche qualche piccolo guadagno di prestazioni, perché può terminare la ricerca non appena trova l'intestazione e non ha bisogno di continuare per la ricerca in tutti i bambini nella struttura visiva (questo è più probabile trascurabile per la maggior parte dei casi).

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

Ed è usato in questo modo:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top