0

何かの中の要素を見つけることになっている次のコードがあります。問題は、最初の列のヘッダーに CheckBox がある DataGrid があることです。チェックボックス自体は<controls:ChildWindow.Resources>、親子ウィンドウのディクショナリに存在するスタイルで定義されています。

実行時に、グリッドのバインディング コレクションのすべての要素が「選択」されている場合は、いまいましいチェックボックスを選択する必要があります。ただし、チェックボックスはスタイルに存在するため、簡単にアクセスできないため、DOM 全体を調べて特定のチェックボックスを見つける必要があります。

これは、DOM Traversal を作成するコードです。これは 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");常にnullが返されることです。ここでの前提は、SomeDataGrid という DataGrid と、HeaderCheckBox というスタイル内で定義された CheckBox があることです。

さらにデバッグすると、これらの拡張メソッドをどのコントロールから呼び出してもVisualTreeHelper.GetChildrenCount、コードの最後の 2 つのメソッドで使用されるメソッド呼び出しは常に 0 を返すこともわかりました。なんてこと?

誰でもこれを修正する方法について何か考えがありますか? ありがとう、マーティン

4

1 に答える 1