|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Как сделать выделение одного узла в TreeView в Silverligth, если при отображении я использую шаблон: Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9.
А для пунктов меню я использую список экземпляров моего типа. Код: c# 1. 2. 3. 4.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Как сделать выделение одного определенного узла дерева, причем он будет зависит от разных факторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2012, 14:47 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Можно ли как то выделить узел в дереве? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 16:18 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Solomka, Поищи мой пост по TreeView. Я по нему очень много чего расписывал - а именно, изменение ControlTemplate. Дело в том что там будут подводные камни если оставить все как есть по умолчанию. Я дмаю тебе не составит труда сделать небольшие изменения для добавления дополнительных тригеров для выделения. А именно - добавь свое свойство булевского значения. Сажай в него логику выделения и добавляй его в MultiTriggers (Data). По идее ничего сложного нет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 21:12 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
unknownfromrusSolomka, Поищи мой пост по TreeView. Я по нему очень много чего расписывал - а именно, изменение ControlTemplate. Дело в том что там будут подводные камни если оставить все как есть по умолчанию. Я дмаю тебе не составит труда сделать небольшие изменения для добавления дополнительных тригеров для выделения. А именно - добавь свое свойство булевского значения. Сажай в него логику выделения и добавляй его в MultiTriggers (Data). По идее ничего сложного нет Нашла твой пост /topic/982313&hl= Только особо не поняла, как он может мне помочь. Нашла в интернете пример Как выделить первый узел дерева: Код: c#
Этот код работает. Достаточно вызвать этот метод и сам узел выделится. Пыталась дальше отталкиваться... В каком нибудь методе определяем параметр по которому нам надо выделить узел: Код: c#
По идее метод SetSelectNodeTag для выделение одного узла. Код: c#
Метод SelectNodeTag по идее должен пробегать рекурсивно по всем узлам дерева, и если обнаружит искомый узел, то выделить его Код: c#
Однако если пользоваться ранее успешно примененной логикой, не удается "достать" хотя бы один подузел. При первом же проходе в цикле for переменные "searchItem", "itemTreeViewItem", "itemTreeViewItem2", "itemTreeViewItem3" - имею пустые значения и в следующем первом рекурсивном заходе в метод возникает ошибка в строчке: Код: c#
Что нельзя обращаться к NULL. Причем если определить первый узел дерева превого уровня, например указав string temp = "1-169"; (169 - родительский для 171), то всё нормльно работает, потому что не пытается достать подузел. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 13:50 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Solomka, Так давай по порядку. Я правильно понимаю, что ты хочешь чтобы выделение узла в TreeView происходило не только по стандартным условиям, но ты еще свои добавишь (логику по которой должно происходить выделение)? Мой пост тебе в помощь в том случае если ты захочешь переопределить Template у TreeView - так как возникнут подводные камни, о которых я там описывал. В твоем же случае - чтобы добавить логику выделения - надо создать свойство, значение которого (Bool типа) будет определяться твоей логикой. И это свойство подцепить в условие IsSelected (найти его можно в Template - где определяется каким цветом и т.д. будет определяться выбранный узел). Так называемый MultiTrigger ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 18:02 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
unknownfromrusSolomka, Так давай по порядку. Я правильно понимаю, что ты хочешь чтобы выделение узла в TreeView происходило не только по стандартным условиям, но ты еще свои добавишь (логику по которой должно происходить выделение)? Что именно подразумевается под стандартными условиями? Если под стандартными условиями подразумевается что пользователь сам выделяет необходимый узел, то ДА, мне нужно добавить свою логику, когда будет выделятся узел. unknownfromrusВ твоем же случае - чтобы добавить логику выделения - надо создать свойство, значение которого (Bool типа) будет определяться твоей логикой. И это свойство подцепить в условие IsSelected (найти его можно в Template - где определяется каким цветом и т.д. будет определяться выбранный узел). Так называемый MultiTrigger Я в Silverligth новичек, вот эта часть текста мне не очень понятна. Если я правильно понимаю, то Template я так переопределяю... Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Если пишу сюда: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
То в дизайнере, выдается ошибка Свойство "ItemTemplate" установлено больше одного раза. Куда надо прописать свойство, чтобы можно было выделать не только узлы первого уровня, но и большего уровня вложенности? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 10:21 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Solomka, Расписывать че-то не хочется. Давай сделаем так - дай мне свой примерчик что ты хочешь сделать - я его поправлю - добавив то что ты хочешь ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 16:18 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
unknownfromrusSolomka, Расписывать че-то не хочется. Давай сделаем так - дай мне свой примерчик что ты хочешь сделать - я его поправлю - добавив то что ты хочешь Ссылка на архив: http://yadi.sk/d/drPA-r0D20ITx Не совсем родной проект, я его упростила, чтобы не отвлекать на сторонние вещи. Слева дерево. справа список с ID узлов дерева. И по ID надо выбрать узел в дереве. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2013, 15:51 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
автор Код: c# 1.
Что здесь происходит? Ты пытаешься взять Header из triCur, из типа TreeViewItem. Ты где-то до этого кладешь в Header ClassNode? Если ты этого не делаешь, то TreeViewItem'у в Header'е неоткуда взяться. Насколько я вижу по коду, тебе нужно делать: Код: c# 1.
а не то, что ты сейчас делаешь. Во-вторых, лучше не доставать из TreeView TreeViewItem'ы при помощи ItemContainerGenerator'а и не работать с элементами интерфейса (TreeViewItem'ами) вручную, а, как тебе уже верно посоветовали, завести в твоем классе данных (ClassNode) свойство IsSelected, реализовать в ClassNode интерфейс INotifyPropertyChanged и установить двухсторонний (TwoWay) биндинг между TreeViewItem'ами и ClassNode с помощью ItemContainerStyle или чего-то подобного. Далее ты можешь выбрать некоторое количество ClassNode'ов, выставить им IsSelected в true и связанные с ними TreeViewItem'ы сами станут выбранными. В-третьих, попробуй скачать проект по своей ссылке. У меня ничего не получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2013, 15:00 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmatic В-третьих, попробуй скачать проект по своей ссылке. У меня ничего не получилось. Странно, у меня всё получается. На всякий случай ещё сюда выложила. http://rapidshare.com/files/1787905320/wsTestSelectNodeToInet.zip ] http://rapidshare.com/files/1787905320/wsTestSelectNodeToInet.zip ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 09:05 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmaticавтор Код: c# 1.
Что здесь происходит? Ты пытаешься взять Header из triCur, из типа TreeViewItem. Ты где-то до этого кладешь в Header ClassNode? Если ты этого не делаешь, то TreeViewItem'у в Header'е неоткуда взяться. Насколько я вижу по коду, тебе нужно делать: Код: c# 1.
а не то, что ты сейчас делаешь. Я ничего не кладу в Header, я через отладку нашла, что это поле содержит информацию о экземпляре класса ClassNode. Код: c# 1.
Попробовала всё равно не помогает. enigmatic Во-вторых, лучше не доставать из TreeView TreeViewItem'ы при помощи ItemContainerGenerator'а и не работать с элементами интерфейса (TreeViewItem'ами) вручную, а, как тебе уже верно посоветовали, завести в твоем классе данных (ClassNode) свойство IsSelected, реализовать в ClassNode интерфейс INotifyPropertyChanged и установить двухсторонний (TwoWay) биндинг между TreeViewItem'ами и ClassNode с помощью ItemContainerStyle или чего-то подобного. Далее ты можешь выбрать некоторое количество ClassNode'ов, выставить им IsSelected в true и связанные с ними TreeViewItem'ы сами станут выбранными. Не очень понимаю, может ли мне это помочь. Мне же надо чтобы выделенные узлы дерева менялись, в процессе работы и не были одним и тем же постоянным узлом... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 09:22 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmaticавтор Код: c# 1.
Что здесь происходит? Ты пытаешься взять Header из triCur, из типа TreeViewItem. Ты где-то до этого кладешь в Header ClassNode? Если ты этого не делаешь, то TreeViewItem'у в Header'е неоткуда взяться. Насколько я вижу по коду, тебе нужно делать: Код: c# 1.
а не то, что ты сейчас делаешь. Тут получается ошибка в строке Код: c# 1.
возникает из-за того что мы в метод передаем переменную itemTreeViewItem2 NULL. Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 10:54 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
SolomkaЯ ничего не кладу в Header, я через отладку нашла, что это поле содержит информацию о экземпляре класса ClassNode. Странно, по идее в Header'e не должно быть ClassNode, но ClassNode должен быть в DataContext'е triCur. Solomkaenigmatic Во-вторых, лучше не доставать из TreeView TreeViewItem'ы при помощи ItemContainerGenerator'а и не работать с элементами интерфейса (TreeViewItem'ами) вручную, а, как тебе уже верно посоветовали, завести в твоем классе данных (ClassNode) свойство IsSelected, реализовать в ClassNode интерфейс INotifyPropertyChanged и установить двухсторонний (TwoWay) биндинг между TreeViewItem'ами и ClassNode с помощью ItemContainerStyle или чего-то подобного. Далее ты можешь выбрать некоторое количество ClassNode'ов, выставить им IsSelected в true и связанные с ними TreeViewItem'ы сами станут выбранными. Не очень понимаю, может ли мне это помочь. Мне же надо чтобы выделенные узлы дерева менялись, в процессе работы и не были одним и тем же постоянным узлом...Эм, функционал редактирования узлов нужен? Solomka http://rapidshare.com/files/1787905320/wsTestSelectNodeToInet.zip rapidshareСкачивание невозможно Download permission denied by uploader. (0b67c2f5) SolomkaСсылка на архив: http://yadi.sk/d/drPA-r0D20ITx Тут выдается первая страница, где есть кнопка "просмотреть", по которой куча файлов, которые нельзя скачать. авторТут получается ошибка в строке ClassNode nd = (ClassNode)triCur.Header возникает из-за того что мы в метод передаем переменную itemTreeViewItem2 NULL. SelectNodeTag03(varString, itemTreeViewItem2);Хорошо, если у тебя там в Header'e всё-таки лежит ClassNode, то лучше выложи свой проект где-нибудь откуда скачать можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 12:18 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmaticвозникает из-за того что мы в метод передаем переменную itemTreeViewItem2 NULL. SelectNodeTag03(varString, itemTreeViewItem2);Хорошо, если у тебя там в Header'e всё-таки лежит ClassNode, то лучше выложи свой проект где-нибудь откуда скачать можно. https://docs.google.com/file/d/0BxprtRW4TI9QWjRkWXBEcGxYOHM/edit http://depositfiles.com/files/0dvgppejn http://disk.yandex.ru/public/?hash=85sSp5Ko4N1JPPvUVo6pTeb4nWqfxhhYcWV4li0RjOo%3D (тут есть кнопочка посмотреть и скачать и сохранить на яндекс.диск) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2013, 15:26 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Solomka, Окей, TreeViewItem зачем-то хранит информацию о привязанных данных не в DataContext (где должен, по идее), а в Header (которого у него нет, по сути). Это во-первых. Во-вторых, сложно сказать почему именно не работает то, что ты хочешь. Просто код кошмарен и его проще переписать заново. В теме уже указывалось как это лучше сделать. unknownfromrusВ твоем же случае - чтобы добавить логику выделения - надо создать свойство, значение которого (Bool типа) будет определяться твоей логикой. И это свойство подцепить в условие IsSelected (найти его можно в Template - где определяется каким цветом и т.д. будет определяться выбранный узел). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2013, 11:25 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmaticSolomka, Окей, TreeViewItem зачем-то хранит информацию о привязанных данных не в DataContext (где должен, по идее), а в Header (которого у него нет, по сути). Это во-первых. При замене на DataContext все арвно происходит ошибка. enigmaticВо-вторых, сложно сказать почему именно не работает то, что ты хочешь. Просто код кошмарен и его проще переписать заново. В теме уже указывалось как это лучше сделать. Если бы , было мне бы понятно, то я бы уже не спрашивала. Можно скинуть пример, чтобы попонятнее было? Кошмарен - не кошмарен... мой код... сказать сложно. В интернете нашла пример с таким кодом И он почти рабочий, для узлом первого уровня ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 09:03 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
unknownfromrusВ твоем же случае - чтобы добавить логику выделения - надо создать свойство, значение которого (Bool типа) будет определяться твоей логикой. И это свойство подцепить в условие IsSelected (найти его можно в Template - где определяется каким цветом и т.д. будет определяться выбранный узел). Так называемый MultiTrigger Можете скинуть пример кода? А то не совсем понятно... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2013, 13:10 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Solomka, Давай скидывай ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2013, 11:19 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Сам недавно столкнулся с такой проблемой. Вроде бы выделить узел по его датаконтексту - не особенно трудный вопрос: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
однако вся проблема - в виртуализации отрисовки: свернутые узлы не отображают своего содержимого, фактически - не содержат его, и на уровне вложенности глубже 2 от корня, если развернут только корень, ItemContainerGenerator.ContainerFromItem(itemToSelect) возвращает null. Т.е. по мере прохода по дереву вглубь надо разворачивать узлы. Но просто установки IsExpanded = true недостаточно - при этом только устанавливается значение DependencyProperty, а заполнение ItemsControl узлами порисходит в отложенном порядке. У TreeView есть метод ExpandSubtree(), но он разварачивает всё поддерево, а надо развернуть только 1 уровень. Пришлось взять рефлектор, влезть в код TreeViewItem, взять оттуда реализацию ExpandSubtree, и модифицировать её (часть используемых методов/свойств там protected internal, поэтому пришлось прибегнуть к reflection). Получилось вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
В комментариях - то, что было в исходном коде. Методы GetIsBound/SetBindingValue используются для того, чтобы в случае, если свойство IsExpanded имеет привязку к модели, изменять (опять же через reflection) свойство модели, а не значение IsExpandedProperty непосредственно, т.к. это сбросит биндинг свойства. Ну, и в результате получаем Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Интрефейс ITraversable заставляет объект модели дерева возвращать все родительские узлы дерева от корня до требуемого элемента. Выглядит он так: Код: c# 1. 2. 3. 4.
и реализуется рекурсией. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2013, 15:18 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Хм, а зачем решать проблему на уровне контролов (TreeViewItem'ов), если можно объявить свойство IsSelected (+INPC) в модели и забиндиться на него? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2013, 06:22 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
enigmaticХм, а зачем решать проблему на уровне контролов (TreeViewItem'ов), если можно объявить свойство IsSelected (+INPC) в модели и забиндиться на него? Затем, что я писал выше: Сон Веры ПавловныНо просто установки IsExpanded = true недостаточно - при этом только устанавливается значение DependencyProperty, а заполнение ItemsControl узлами происходит в отложенном порядке. Аналогично без толку выставлять в true свойство модели, забинденное на IsExpanded - ItemContainerGenerator.ContainerFromItem(itemToSelect) будет возвращать null, т.к. ItemsControl узла на момент после установки свойства не заполнится соответствующими контролами. Это всё проверено на практике. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2013, 09:45 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Не знаю почему бестолку. Недавно сделал тривью в комбобоксе. У меня были вложенные объекты. К объектам добавил свойство IsExpanded (поле класса объекта). Установил биндинг - и у меня разворачивается независимо от вложенности объектов (ЗАполнение объектов реализовано через HierarchiDataTemplate). Аналогично с IsSelected. Вытаскивать из проекта Тривью я не хочу, чтобы тут выкладывать. Тот кто поднимал тему - ему по ходу по фиг - раз до сих пор не выложил примерчик кода - я хотел попробовать в нем переопределить тривью ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2013, 12:53 |
|
Как сделать выделение одного узла в TreeView в Silverligth?
|
|||
---|---|---|---|
#18+
unknownfromrusУстановил биндинг - и у меня разворачивается независимо от вложенности объектов (ЗАполнение объектов реализовано через HierarchiDataTemplate). Аналогично с IsSelected. А где биндинг делается и какого контрола? В HierarchiDataTemplate что-то или в самом TreeView? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2013, 02:00 |
|
|
start [/forum/topic.php?fid=21&fpage=31&tid=1441453]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 324ms |
total: | 485ms |
0 / 0 |