Как получить детей ContentPresenter? - PullRequest
23 голосов
/ 12 ноября 2010

Используя код, я могу получить контент-презентатор. Я хотел бы найти первое текстовое поле внутри него и соответственно установить фокус.

Dim obj = TerritoryListViewer.ItemContainerGenerator.ContainerFromItem(myModel)

Ответы [ 3 ]

28 голосов
/ 12 ноября 2010

Вы можете использовать VisualTreeHelper статический класс для сканирования дерева элементов управления. Вот как это можно сделать в c # (извините, я VB дислексик))

 T FindFirstChild<T>(FrameworkElement element) where T: FrameworkElement
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(element);
        var children = new FrameworkElement[childrenCount];

        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement;
            children[i] = child;
            if (child is T)
                return (T)child;
        }

        for (int i = 0; i < childrenCount; i++)
            if (children[i] != null)
            {
                var subChild = FindFirstChild<T>(children[i]);
                if (subChild != null)
                    return subChild;
            }

        return null;
    }
9 голосов
/ 18 июля 2016

ContentPresenter имеет единственного ребенка. Вы получаете ребенка просто

VisualTreeHelper.GetChild(yourContentPresenterObj, 0);

Если вам нужно пойти глубже - до первого найденного TextBox, тогда, да, вы используете более комплексный подход, предложенный @ alpha-mouse.

3 голосов
/ 12 ноября 2010
Dim myContentPresenter = CType(obj, ContentPresenter)
Dim myDataTemplate = myContentPresenter.ContentTemplate
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...