سؤال

قانون بلدي على النحو التالي:

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

        }
    }

احتاج DataGridColumnHeader من العمود. هل أنا على خطأ؟

هل كانت مفيدة؟

المحلول

كائن رأس DataGridColumn هو في الواقع الرأس المرئي لهذا العمود ، كل ما قمت بتعيينه ليكون. DataGridColumn ليس جزءًا من الشجرة المرئية ، لذا لا توجد طريقة مباشرة للوصول إلى DataGridColumnheader لذلك (لا يمكننا حتى التأكد من وجودها بعد). ولكن يمكنك أن تفعل شيئًا كهذا لمحاولة الوصول إليه

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

نصائح أخرى

بينما إجابة فريدريك يوفر نهجًا تم إعادة تمهيده مع طريقة إضافية يمكن إعادة استخدامها في أجزاء أخرى من الكود ، فضلت توحيد أساليبه إلى طريقة واحدة. قد يكون هناك أيضًا بعض كسب الأداء الصغير لأنه يمكن أن ينهي البحث بمجرد أن يجد الرأس ولا يحتاج إلى الاستمرار في البحث من خلال جميع الأطفال في الشجرة المرئية (هذا على الأرجح ضئيلًا لمعظم الحالات).

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

ويستخدم مثل ذلك:

DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top