Frage

Mein Code ist wie folgt:

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

        }
    }

muss ich aus der Säule DataGridColumnHeader. Wo bin ich falsch gehen?

War es hilfreich?

Lösung

Das Header-Objekt des Datagrid ist eigentlich die sichtbaren Header dieser Spalte, was auch immer Sie es festgelegt sein. Datagrid ist nicht Teil der Baumstruktur, so gibt es keinen direkten Weg, um den Zugang der DataGridColumnHeader dafür (wir nicht einmal sicher sein kann, es existiert noch) nicht. Aber man kann etwas tun, um zu versuchen und greifen Sie

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

Andere Tipps

Während Fredrik Antwort einen Überarbeitete Ansatz mit zusätzlichen Verfahren bietet, die möglicherweise in anderen Teilen des Codes wiederverwendet werden könnten, ich bevorzugt auf seine Methoden in einem einzigen Verfahren zu konsolidieren. Es kann auch einige kleine Performance-Gewinn sein, weil es die Suche so schnell beenden können, wie es den Header findet, und es muss nicht weiter durch alle Kinder in der visuellen Struktur suchen (dies ist wahrscheinlich vernachlässigbar für die meisten Fälle).

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

Und es ist wie so verwendet:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top