powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / TreeViewItem
25 сообщений из 39, страница 1 из 2
TreeViewItem
    #38597826
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В XAML-е "посажено" деревце:
Код: c#
1.
<TreeView Name="tv" ....


В коде могу получить элемент данных этого дерева, например:
Код: c#
1.
CData data= tv.SelectedItem as CData;


Вопрос:
Как получить элемент типа TreeViewItem, соответствующий выбранному элементу данных ???
...
Рейтинг: 0 / 0
TreeViewItem
    #38598061
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как LogicalTreeHelper.GetParent(tv.SelectedItem) , но не проверял...
...
Рейтинг: 0 / 0
TreeViewItem
    #38598118
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом "деревянном зодчестве" столько сюрпризов.
Собрал деревянную веточку (без использования ItemsSource) и прицепил ее к дереву:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TreeViewItem root = new TreeViewItem() { Header = "Root" }
TreeViewItem prn = root;
TreeViewItem chl = null;

chl = new TreeViewItem() { Header = "aaa" };
prn.Items.Add(chl);
prn = chl;
			
chl = new TreeViewItem() { Header = "bbb" };
prn.Items.Add(chl);
prn = chl;

chl = new TreeViewItem() { Header = "ccc" };
prn.Items.Add(chl);
prn = chl;

MyTree.Items.Add(root);


Дерево "выросло", но обработчик SelectedItemChanged при мышинном выборе не срабатывает.
Вроде вполне законный способ.
Может чего-то не хватает в настройках дерева?
...
Рейтинг: 0 / 0
TreeViewItem
    #38598281
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LogicalTreeHelper не помог что ли? Да и зачем всё это? Чем здесь MVVM не угодил?
...
Рейтинг: 0 / 0
TreeViewItem
    #38598438
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C LogicalTreeHelper пытаюсь пока не очень выходит.
На счет MVVM. Пока в нем не работаю, но мне казалось, что работа с TreeView происходит точно также как в обычном WPF.
Хотя утверждать не буду чего не знаю.
Второй пример я рассматривал для того, чтобы на совсем простом примере разглядеть как работает TreeView.
Но, получил непонятное явление - нет реакции на селекцию узла. Это случай когда деревянные данные введены не через ItemsSource, а напрямую через добавление TreeViewItem в коллекции Items Parent-узлов. В этом случае я изначально мог получить TreeViewItem, чтобы потом их не искать. Но на этом пути получил облом.
Так что пока еще ничего не добился.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598674
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXC LogicalTreeHelper пытаюсь пока не очень выходит.Что там может "не выходить"? :-)
Код: c#
1.
var item = (TreeViewItem)LogicalTreeHelper.GetParent(tv.SelectedItem);


ЧитательXНа счет MVVM. Пока в нем не работаю, но мне казалось, что работа с TreeView происходит точно также как в обычном WPF.В "обычном WPF" делают привязку данных на модель, в данном случае через HierarhicalDataTemplate.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598675
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут пример.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598737
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается. См аттач.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598771
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXНе получается. См аттач.Согласен, не получится. Тогда можно пробежаться по визуальному дереву как-то так:
Код: c#
1.
2.
3.
var item = VisualTreeHelperEx.GetChildrenTree(myTreeView)
    .OfType<TreeViewItem>()
    .First(v => v.DataContext == myTreeView.SelectedItem);


Исходник VisualTreeHelperEx .
...
Рейтинг: 0 / 0
TreeViewItem
    #38598798
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пошел по цепочке собирать исходники для исходников.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598903
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал собственный код для "прогулки" по VisualTree.
Но, теперь есть другая проблема. В этом дереве представлены только видимые элементы.
Т.е. если дерево свернуто, то виден только корневой TreeViewItem.
Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку.
Как искать такой DependencyObject? Его в дереве нет.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598911
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXНо, теперь есть другая проблема. В этом дереве представлены только видимые элементы.Само собой.
ЧитательXТ.е. если дерево свернуто, то виден только корневой TreeViewItem.
Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку.
Как искать такой DependencyObject? Его в дереве нет.Надо идти с корня дерева и разворачивать по очереди всех "родителей" целевого элемента дерева.
...
Рейтинг: 0 / 0
TreeViewItem
    #38598925
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы: В этом случае лучше искать TreeViewItem с помощью ItemContainerGenerator.ContainerFromItem.
...
Рейтинг: 0 / 0
TreeViewItem
    #38599067
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут, как уж повелось, другая беда. Если узлы дерева не открывались, то
tvi.ItemContainerGenerator имеет атрибут:
Код: c#
1.
Status=NotStarted


и попытка взять TreeViewItem дает null:
Код: c#
1.
tvi.ItemContainerGenerator.ContainerFromItem(DataItem) =>null


Может быть есть способ заставить сгенерить контейнеры для всего дерева не прибегая к его полному раскрытию?
...
Рейтинг: 0 / 0
TreeViewItem
    #38599092
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXМожет быть есть способ заставить сгенерить контейнеры для всего дерева не прибегая к его полному раскрытию?А зачем? Ведь целью является развёртывание дерева. Открываем. После открытия ItemContainerGenerator будет иметь содержимое, используем его для поиска следующего открываемого элемента.
...
Рейтинг: 0 / 0
TreeViewItem
    #38599167
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никак нет.
Дерево должно стартовать либо полностью свернутым, либо частично приоткрым, например, развернут только корень.
Потому что если сразу развернуть все дерево, то пользователь визуально окажется где-то глубоко внутри. И каждый раз ему придется совершать операцию выхода на верх и операцию свертывания лишнего. Это очень скоро вызовет буйный протест.
(даже пострадают некоторые люди). Поэтому, начальное состояние дерева это частично свернутое состояние. А отсюда и више указанная проблема.
...
Рейтинг: 0 / 0
TreeViewItem
    #38599228
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXНикак нет.
Дерево должно стартовать либо полностью свернутым, либо частично приоткрым, например, развернут только корень.
Потому что если сразу развернуть все дерево, то пользователь визуально окажется где-то глубоко внутри. И каждый раз ему придется совершать операцию выхода на верх и операцию свертывания лишнего. Это очень скоро вызовет буйный протест.
(даже пострадают некоторые люди). Поэтому, начальное состояние дерева это частично свернутое состояние. А отсюда и више указанная проблема.Я и не предлагаю разворачивать всё дерево, я предлагаю разворачивать от корня до целевого элемента.
...
Рейтинг: 0 / 0
TreeViewItem
    #38599542
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так вот как до него (до целевого узла) добраться.
Ведь изначально вся цепочка контейнеров (исключая видимый корень) имеют состояние NotSarted и поэтому все их дочернее подмножество узлов недоступно для иерархического прохода.
Было бы хорошо заставить эти контейнеры стартовать (без развертывания!!!).
...
Рейтинг: 0 / 0
TreeViewItem
    #38599782
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXТак вот как до него (до целевого узла) добраться.
Ведь изначально вся цепочка контейнеров (исключая видимый корень) имеют состояние NotSarted и поэтому все их дочернее подмножество узлов недоступно для иерархического прохода.
Было бы хорошо заставить эти контейнеры стартовать (без развертывания!!!).Само собой, дети создаются после "разворота" родителя. Поэтому, сначала разворачиваем текущий элемент, потом ищем его детей.
...
Рейтинг: 0 / 0
TreeViewItem
    #38601585
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да! я долго бился, чтобы создать все элементы дерева без "разворота". Но, ничего лучшего не нашел чем сделать
root.Expandsubtree();
и тут же все свернуть обратно. В принципе такое решение тоже сойдет.
Погружение в тонкости функционирования TreeView несколько обескураживает. Требуется слишком много рукоприкладства для того, чтобы попользоваться компонентом. Особенно меня удивило слабая связь между элементом данных Data, который привязан к элементу TreeViewItem и самим этим TreeViewItem. Казалось бы они связаны непосредственно, но получить из Data его контейнер не совсем просто. Отдает какой-то "сыростью" модели.
Ну ладно! Поворчал и будет. В общем необходимые действия для работы с деревцем я для себя сформировал.
Спасибо за участие в обсуждении и за подсказки.
...
Рейтинг: 0 / 0
TreeViewItem
    #38601615
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧитательXНо, теперь есть другая проблема. В этом дереве представлены только видимые элементы.Само собой.
ЧитательXТ.е. если дерево свернуто, то виден только корневой TreeViewItem.
Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку.
Как искать такой DependencyObject? Его в дереве нет.Надо идти с корня дерева и разворачивать по очереди всех "родителей" целевого элемента дерева.
Когда дело доходит до такой ручной работы, уже проще кажется MVVM .

Ищите по "Expand all the way up to the root" - как сделать авторазворачиваемые "отсюда и до корня". Как сделать "отсюда и все ветки до конца" - думаю, как-то подобным образом же.

На самом деле без MVVM проще только для самых простых примеров, когда, как вы сказали, "чтобы на совсем простом примере разглядеть как работает TreeView". Когда примеры становятся сложнее, то принцип работы меняется. Без MVVM вам придётся писать кучку методов по обходу и разворачиванию-сворачиванию веток. Где эти методы будут? В воздухе висеть? В некоей библиотеке "хелперов для тривью"? А в MVVM у вас вся логика по работе с вашим тривью инкапсулирована в моделях представления будет.
...
Рейтинг: 0 / 0
TreeViewItem
    #38601643
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Когда дело доходит до такой ручной работы, уже проще кажется MVVM .Алексей КДа и зачем всё это? Чем здесь MVVM не угодил?
ЧитательXНа счет MVVM. Пока в нем не работаю...
...
Рейтинг: 0 / 0
TreeViewItem
    #38601651
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320На самом деле без MVVM проще только для самых простых примеров, когда, как вы сказали, "чтобы на совсем простом примере разглядеть как работает TreeView". Когда примеры становятся сложнее, то принцип работы меняется. Без MVVM вам придётся писать кучку методов по обходу и разворачиванию-сворачиванию веток. Где эти методы будут? В воздухе висеть? В некоей библиотеке "хелперов для тривью"? А в MVVM у вас вся логика по работе с вашим тривью инкапсулирована в моделях представления будет.Тут не всё так однозначно, есть и другая точка зрения.

Накой мне писать свой класс ViewModel и логику инкапсуляции в него Model, если есть готовый класс TreeViewItem и механизм ItemsControl.ItemContainerGenerator? Разумнее рассматривать класс TreeViewItem как часть ViewModel. Тогда и концепция MVVM применяется и все имеющиеся возможности WPF используются.
...
Рейтинг: 0 / 0
TreeViewItem
    #38601656
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320Когда дело доходит до такой ручной работы, уже проще кажется MVVM .Алексей КДа и зачем всё это? Чем здесь MVVM не угодил?
ЧитательXНа счет MVVM. Пока в нем не работаю...
Так я к тому сказал, что проще будет перейти на MVVM. Объём кода в MVVM такой же или меньше, зато структурированности больше. MVVM хуже только для самых простых приложений - там он действительно выглядит ненужным нагромождением монструозных конструкций.

Если что, MVVM можно организовать и для отдельно взятой сущности или участка программы. Можно проще ещё сделать - сделать только VM и V. Собственно, WPF только вокруг ВМ и В и построен. Я так написал одно приложеньице, когда надо было к готовой логике интерфейсик приделать.

Правда, пришлось (и тому придётся, кто собирается это для своей программы делать) написать некоторую логику в сеттерах и командах, а не просто свойства модели присваивать-считывать, т. к. моя "готовая логика", к которой я интерфейс приделывал, явно не была заточена под MVVM. Но всё равно всё сводится либо к написанию своей собственной "модели"-адаптера для работы с чужой логикой и моей структурой ВМ-В, либо эту модель-адаптер придётся по коду геттеров-сеттеров и команд во вью-модели раскидывать. Короче, нужен будет адаптер. Но даже с таким подходом это лучше, чем городить ручные обходы дерева и методы сворачивания-разворачивания узлов.
...
Рейтинг: 0 / 0
TreeViewItem
    #38601662
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КРазумнее рассматривать класс TreeViewItem как часть ViewModel. Тогда и концепция MVVM применяется и все имеющиеся возможности WPF используются.
Там когда привязку делаешь, TreeViewItem автоматом генерится как обёртка над привязываемым значением из модели представления, вроде.

Я, правда, не понял, почему у ТСа не отрабатывается событие SelectedItemChanged. У меня через MVVM к тому же событию команда привязана и всё отрабатывается, когда я кликаю на невыбранный айтим.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / TreeViewItem
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]