перемещаться по всем элементам в представлении дерева wpf - PullRequest
1 голос
/ 04 апреля 2009

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

Мне интересно, как я это делаю. У элементов управления нет детей для прохождения.

Я начал использовать LogicalTreeHelper.GetChildren, который, кажется, работает должным образом, до тех пор, пока я не нажму элемент управления TreeView ... затем LogicalTreeHelper.GetChildren не возвращает никаких дочерних элементов.

Примечание: цель состоит в том, чтобы найти элемент визуального интерфейса пользователя, который соответствует элементу данных. То есть, учитывая идентификатор элемента, найдите элемент UI, отображающий его.

Редактировать: Я, видимо, недостаточно хорошо объясняю это. Я связываю некоторые объекты данных с элементом управления TreeView, а затем хочу выбрать конкретный элемент программно, учитывая идентификатор этого бизнес-объекта. Я не понимаю, почему так сложно обойти визуальное дерево и найти нужный мне элемент, поскольку идентификатор объекта данных находится в свойстве Tag соответствующего визуального элемента. Я использую Mole, и я могу найти элемент пользовательского интерфейса с соответствующим идентификатором в его теге. Я просто не могу найти визуальный элемент в коде. LogicalTreeHelper не пересекает никакие элементы в дереве. ItemContainerGenerator.ContainerFromItem также не получает ничего для элементов в древовидном представлении.

Ответы [ 4 ]

1 голос
/ 06 апреля 2009

Взгляните на этот образец . Я нашел этот пример очень хорошо написанным, и я считаю, что использование view-модели решит вашу проблему.

Редактировать: А что касается поиска визуального дерева. И TreeView, и TreeViewItem имеют свойство Items, которое вы можете просматривать и искать по своему идентификатору. Вы не можете использовать это?

0 голосов
/ 10 апреля 2009

Я делал подобные вещи, повторяя визуальное дерево с помощью VisualTreeHelper. Прочтите это сообщение в блоге , написанное Джимом Бальцелем-Готье - в нем есть несколько вспомогательных методов для обхода визуального дерева и возврата элемента по имени и типу, это похоже на код, который я использую в моем текущий проект. Вы можете изменить эти функции, чтобы он проверял значения тегов вместо или в дополнение к имени.

Одна вещь, о которой нужно знать с деревом визуалов, это то, что его там нет, если визуалы не были загружены - вам может понадобиться прикрепить делегат к событию «Loaded» вашего визуального элемента, если визуал не был отображается еще в тот момент, когда вы вызываете код.

0 голосов
/ 10 апреля 2009

LogicalTreeHelper.GetChildren просматривает свойство элемента управления LogicalChildren, которое по умолчанию равно null для TreeView (производного от класса ItemsControl). Возможно, вам придется проверить тип объектов, возвращаемых GetChildren, и когда вы придете к объекту TreeView, выполните специальную логику обработки.

Эта специальная логика, вероятно, будет перебирать Предметы дерева и пытаться привести их к FrameworkElement (базовому классу, который определяет свойство Tag).

0 голосов
/ 04 апреля 2009

Проблема в том, что были созданы только видимые TreeViewItems - WPF не создает все элементы сразу (из-за продолжительности времени, которое может потребоваться для больших деревьев, я мог бы представить).

Лучшим подходом было бы создать структуру данных, которая имитирует структуру данных вашего дерева, и использовать привязку данных, чтобы сообщить TreeView, как отображать эти данные. Я могу написать простой пример, если хотите.

РЕДАКТИРОВАТЬ: на основе вашего редактирования, это будет работать, только если для этого объекта был создан элемент пользовательского интерфейса, что не гарантируется. Взгляните на интерфейс IItemContainerGenerator (полученный с помощью вызова ItemsControl.ItemContainerGenerator . Я считаю, что у него есть метод, который будет возвращать контейнер пользовательского интерфейса (т.е. TreeViewItem) для данного объекта данных Это будет работать только в том случае, если контейнер пользовательского интерфейса был создан ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...