0

我有以下代码应该在某物内部找到一个元素。问题是我有一个 DataGrid,它的第一列的标题中有一个 CheckBox。复选框本身定义在一个样式中,该样式存在于<controls:ChildWindow.Resources>父子窗口的字典中。

在运行时,如果网格的绑定集合的所有元素都被“选中”,那么我需要选中该死的复选框。但是,由于复选框存在于样式中,因此不容易访问,因此我需要遍历整个 DOM 以找到特定的复选框。

这是实现 DOM 遍历的代码。它是作为 FrameworkElement 的扩展方法实现的,因此我可以从任何继承自的控件调用 FindElement 或 GetChildren 方法FrameworkElement

public static class FrameworkElementExtensions
{
    public static FrameworkElement FindElement(this FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch)
    {
        FrameworkElement childFrameworkElementFound = null;
        parentFrameworkElement.SearchElements(ref childFrameworkElementFound, childFrameworkElementNameToSearch);
        return childFrameworkElementFound;
    }

    public static List<FrameworkElement> GetChildren(this FrameworkElement parentElement)
    {
        List<FrameworkElement> childFrameworkElementsFound = new List<FrameworkElement>();
        parentElement.GetChildren(childFrameworkElementsFound);
        return childFrameworkElementsFound;
    }

    public static void SearchElements(this FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName)
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
        if (childrenCount > 0)
        {
            FrameworkElement childFrameworkElement = null;
            for (int i = 0; i < childrenCount; i++)
            {
                childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
                if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName))
                {
                    childFrameworkElementToFind = childFrameworkElement;
                    return;
                }
                childFrameworkElement.SearchElements(ref childFrameworkElementToFind, childFrameworkElementName);
            }
        }
    }

    public static void GetChildren(this FrameworkElement parentFrameworkElement, List<FrameworkElement> allChildFrameworkElement)
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
        if (childrenCount > 0)
        {
            for (int i = 0; i < childrenCount; i++)
            {
                FrameworkElement childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
                    allChildFrameworkElement.Add(childFrameworkElement);
                    childFrameworkElement.GetChildren(allChildFrameworkElement);
            }
        }
    }
}

所以手头的问题是,当我按照它的方式调用某些东西时,SomeDataGrid.FindElement("HeaderCheckBox");它总是返回一个空值。这里的假设是我有一个名为 SomeDataGrid 的 DataGrid 和一个在名为 HeaderCheckBox 的样式中定义的 CheckBox。

经过进一步调试,我还发现无论我从哪个控件调用这些扩展方法,VisualTreeHelper.GetChildrenCount我代码中最后两个方法中使用的方法调用总是返回 0 ??? 怎么回事?

任何人都知道如何解决这个问题?谢谢,马丁

4

1 回答 1

0

好没问题。这里是。

它是用 VS2010 和 Silverlight 4 制作的……以防万一。

于 2011-08-04T14:54:52.847 回答