|
TreeViewItem
|
|||
---|---|---|---|
#18+
В XAML-е "посажено" деревце: Код: c# 1.
В коде могу получить элемент данных этого дерева, например: Код: c# 1.
Вопрос: Как получить элемент типа TreeViewItem, соответствующий выбранному элементу данных ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 11:19 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Вроде как LogicalTreeHelper.GetParent(tv.SelectedItem) , но не проверял... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 13:35 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
В этом "деревянном зодчестве" столько сюрпризов. Собрал деревянную веточку (без использования ItemsSource) и прицепил ее к дереву: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Дерево "выросло", но обработчик SelectedItemChanged при мышинном выборе не срабатывает. Вроде вполне законный способ. Может чего-то не хватает в настройках дерева? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 14:16 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
LogicalTreeHelper не помог что ли? Да и зачем всё это? Чем здесь MVVM не угодил? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 16:14 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
C LogicalTreeHelper пытаюсь пока не очень выходит. На счет MVVM. Пока в нем не работаю, но мне казалось, что работа с TreeView происходит точно также как в обычном WPF. Хотя утверждать не буду чего не знаю. Второй пример я рассматривал для того, чтобы на совсем простом примере разглядеть как работает TreeView. Но, получил непонятное явление - нет реакции на селекцию узла. Это случай когда деревянные данные введены не через ItemsSource, а напрямую через добавление TreeViewItem в коллекции Items Parent-узлов. В этом случае я изначально мог получить TreeViewItem, чтобы потом их не искать. Но на этом пути получил облом. Так что пока еще ничего не добился. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2014, 19:05 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXC LogicalTreeHelper пытаюсь пока не очень выходит.Что там может "не выходить"? :-) Код: c# 1.
ЧитательXНа счет MVVM. Пока в нем не работаю, но мне казалось, что работа с TreeView происходит точно также как в обычном WPF.В "обычном WPF" делают привязку данных на модель, в данном случае через HierarhicalDataTemplate. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 06:03 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Не получается. См аттач. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 08:44 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXНе получается. См аттач.Согласен, не получится. Тогда можно пробежаться по визуальному дереву как-то так: Код: c# 1. 2. 3.
Исходник VisualTreeHelperEx . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 09:27 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Пошел по цепочке собирать исходники для исходников. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 09:52 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Написал собственный код для "прогулки" по VisualTree. Но, теперь есть другая проблема. В этом дереве представлены только видимые элементы. Т.е. если дерево свернуто, то виден только корневой TreeViewItem. Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку. Как искать такой DependencyObject? Его в дереве нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 11:20 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXНо, теперь есть другая проблема. В этом дереве представлены только видимые элементы.Само собой. ЧитательXТ.е. если дерево свернуто, то виден только корневой TreeViewItem. Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку. Как искать такой DependencyObject? Его в дереве нет.Надо идти с корня дерева и разворачивать по очереди всех "родителей" целевого элемента дерева. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 11:25 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
зы: В этом случае лучше искать TreeViewItem с помощью ItemContainerGenerator.ContainerFromItem. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 11:30 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Тут, как уж повелось, другая беда. Если узлы дерева не открывались, то tvi.ItemContainerGenerator имеет атрибут: Код: c# 1.
и попытка взять TreeViewItem дает null: Код: c# 1.
Может быть есть способ заставить сгенерить контейнеры для всего дерева не прибегая к его полному раскрытию? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 12:57 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXМожет быть есть способ заставить сгенерить контейнеры для всего дерева не прибегая к его полному раскрытию?А зачем? Ведь целью является развёртывание дерева. Открываем. После открытия ItemContainerGenerator будет иметь содержимое, используем его для поиска следующего открываемого элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 13:14 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Никак нет. Дерево должно стартовать либо полностью свернутым, либо частично приоткрым, например, развернут только корень. Потому что если сразу развернуть все дерево, то пользователь визуально окажется где-то глубоко внутри. И каждый раз ему придется совершать операцию выхода на верх и операцию свертывания лишнего. Это очень скоро вызовет буйный протест. (даже пострадают некоторые люди). Поэтому, начальное состояние дерева это частично свернутое состояние. А отсюда и више указанная проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 14:06 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXНикак нет. Дерево должно стартовать либо полностью свернутым, либо частично приоткрым, например, развернут только корень. Потому что если сразу развернуть все дерево, то пользователь визуально окажется где-то глубоко внутри. И каждый раз ему придется совершать операцию выхода на верх и операцию свертывания лишнего. Это очень скоро вызовет буйный протест. (даже пострадают некоторые люди). Поэтому, начальное состояние дерева это частично свернутое состояние. А отсюда и више указанная проблема.Я и не предлагаю разворачивать всё дерево, я предлагаю разворачивать от корня до целевого элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 14:38 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Так вот как до него (до целевого узла) добраться. Ведь изначально вся цепочка контейнеров (исключая видимый корень) имеют состояние NotSarted и поэтому все их дочернее подмножество узлов недоступно для иерархического прохода. Было бы хорошо заставить эти контейнеры стартовать (без развертывания!!!). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 18:52 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
ЧитательXТак вот как до него (до целевого узла) добраться. Ведь изначально вся цепочка контейнеров (исключая видимый корень) имеют состояние NotSarted и поэтому все их дочернее подмножество узлов недоступно для иерархического прохода. Было бы хорошо заставить эти контейнеры стартовать (без развертывания!!!).Само собой, дети создаются после "разворота" родителя. Поэтому, сначала разворачиваем текущий элемент, потом ищем его детей. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 12:45 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Да! я долго бился, чтобы создать все элементы дерева без "разворота". Но, ничего лучшего не нашел чем сделать root.Expandsubtree(); и тут же все свернуть обратно. В принципе такое решение тоже сойдет. Погружение в тонкости функционирования TreeView несколько обескураживает. Требуется слишком много рукоприкладства для того, чтобы попользоваться компонентом. Особенно меня удивило слабая связь между элементом данных Data, который привязан к элементу TreeViewItem и самим этим TreeViewItem. Казалось бы они связаны непосредственно, но получить из Data его контейнер не совсем просто. Отдает какой-то "сыростью" модели. Ну ладно! Поворчал и будет. В общем необходимые действия для работы с деревцем я для себя сформировал. Спасибо за участие в обсуждении и за подсказки. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 10:13 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Алексей КЧитательXНо, теперь есть другая проблема. В этом дереве представлены только видимые элементы.Само собой. ЧитательXТ.е. если дерево свернуто, то виден только корневой TreeViewItem. Но, если мне нужно программно найти узел внутри дерева и развернуть эту веточку. Как искать такой DependencyObject? Его в дереве нет.Надо идти с корня дерева и разворачивать по очереди всех "родителей" целевого элемента дерева. Когда дело доходит до такой ручной работы, уже проще кажется MVVM . Ищите по "Expand all the way up to the root" - как сделать авторазворачиваемые "отсюда и до корня". Как сделать "отсюда и все ветки до конца" - думаю, как-то подобным образом же. На самом деле без MVVM проще только для самых простых примеров, когда, как вы сказали, "чтобы на совсем простом примере разглядеть как работает TreeView". Когда примеры становятся сложнее, то принцип работы меняется. Без MVVM вам придётся писать кучку методов по обходу и разворачиванию-сворачиванию веток. Где эти методы будут? В воздухе висеть? В некоей библиотеке "хелперов для тривью"? А в MVVM у вас вся логика по работе с вашим тривью инкапсулирована в моделях представления будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 10:33 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
user7320Когда дело доходит до такой ручной работы, уже проще кажется MVVM .Алексей КДа и зачем всё это? Чем здесь MVVM не угодил? ЧитательXНа счет MVVM. Пока в нем не работаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 11:00 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
user7320На самом деле без MVVM проще только для самых простых примеров, когда, как вы сказали, "чтобы на совсем простом примере разглядеть как работает TreeView". Когда примеры становятся сложнее, то принцип работы меняется. Без MVVM вам придётся писать кучку методов по обходу и разворачиванию-сворачиванию веток. Где эти методы будут? В воздухе висеть? В некоей библиотеке "хелперов для тривью"? А в MVVM у вас вся логика по работе с вашим тривью инкапсулирована в моделях представления будет.Тут не всё так однозначно, есть и другая точка зрения. Накой мне писать свой класс ViewModel и логику инкапсуляции в него Model, если есть готовый класс TreeViewItem и механизм ItemsControl.ItemContainerGenerator? Разумнее рассматривать класс TreeViewItem как часть ViewModel. Тогда и концепция MVVM применяется и все имеющиеся возможности WPF используются. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 11:07 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Алексей Кuser7320Когда дело доходит до такой ручной работы, уже проще кажется MVVM .Алексей КДа и зачем всё это? Чем здесь MVVM не угодил? ЧитательXНа счет MVVM. Пока в нем не работаю... Так я к тому сказал, что проще будет перейти на MVVM. Объём кода в MVVM такой же или меньше, зато структурированности больше. MVVM хуже только для самых простых приложений - там он действительно выглядит ненужным нагромождением монструозных конструкций. Если что, MVVM можно организовать и для отдельно взятой сущности или участка программы. Можно проще ещё сделать - сделать только VM и V. Собственно, WPF только вокруг ВМ и В и построен. Я так написал одно приложеньице, когда надо было к готовой логике интерфейсик приделать. Правда, пришлось (и тому придётся, кто собирается это для своей программы делать) написать некоторую логику в сеттерах и командах, а не просто свойства модели присваивать-считывать, т. к. моя "готовая логика", к которой я интерфейс приделывал, явно не была заточена под MVVM. Но всё равно всё сводится либо к написанию своей собственной "модели"-адаптера для работы с чужой логикой и моей структурой ВМ-В, либо эту модель-адаптер придётся по коду геттеров-сеттеров и команд во вью-модели раскидывать. Короче, нужен будет адаптер. Но даже с таким подходом это лучше, чем городить ручные обходы дерева и методы сворачивания-разворачивания узлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 11:12 |
|
TreeViewItem
|
|||
---|---|---|---|
#18+
Алексей КРазумнее рассматривать класс TreeViewItem как часть ViewModel. Тогда и концепция MVVM применяется и все имеющиеся возможности WPF используются. Там когда привязку делаешь, TreeViewItem автоматом генерится как обёртка над привязываемым значением из модели представления, вроде. Я, правда, не понял, почему у ТСа не отрабатывается событие SelectedItemChanged. У меня через MVVM к тому же событию команда привязана и всё отрабатывается, когда я кликаю на невыбранный айтим. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 11:19 |
|
|
start [/forum/topic.php?fid=21&msg=38601585&tid=1441159]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 572ms |
0 / 0 |