|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Добрый день! Пару дней назад начал писать своё первое приложение WPF, пока ещё не совсем разобрался как работает привязка данных. Помогите разобраться на примере файловой системы. Набор данных следующий: VB.NET DataSet Код: vbnet 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.
C# DataSet Код: 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.
XAML разметка для TreeView следующая: Код: xml 1. 2. 3. 4. 5. 6. 7.
Тут по идее должен был вывести список дисков, но получается абсолютно пустое дерево. Помогите разметку сделать под заданный набор данных. В идеале, каждый тип ещё и соответствующей иконкой выделить. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 05:19 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Arik, нужно в первую очередь отойти от DataTable и DataSet и начать работать с коллекциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 12:01 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
А если в данном случае удобнее работать именно с DataSet? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 15:55 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Arik, тогда Вам будет неудобнее работать со всем WPF. Тем более что мешает преобразовать Dataset в структуру с коллекциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2017, 18:48 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
vb_sub, Хорошо, допустим получили мы следующую структуру: Код: vbnet 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.
Наполнили данными: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Какая должна быть XAML разметка для TreeView, что к чему привязывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 01:07 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Arik, Самый простой вариант будет работать примерно так: вы создаете базовый класс али FileSystemObject внутри которого есть свой коллекция Children, либо сам объект унаследован от List<FileSystemObject>, так вы быстро получите нужную иерархию объектов производных от FileSystemObject. В TreeView к свойству ItemsSource нужно будет биндить либо коллекцию таких объектов, либо сам объект (root). Затем в <HierarchyDataTemplate> вы указываете в ItemsScoute через Binding список дочерних объектов. Это либо сам объект, если он унаследован от List<T>, либо свойство Children. В TreeView, каждый элемент дерева является ItemsControl'ом, что позволяет добиться их иерархии относительно друг друга. Виртуализация в базовом контроле работает нормально. Есть более сложный путь, когда вы создаете ICollectionView на основе иерархии и поддержки основных интерфейсов для коллекций на обновление, получение представления, текущем элементе и прочим, но представляете её в виде списка для 1ого ItemsControl'а, то есть дерево будет в 1 ItemsControl'е, вертикальная виртуализация будет так же работать в ListBox и использовать можно будет в любом элементе управления унаследованном в ItemsControl. Вывод: a) в ViewModel должна быть иерархия базового класса для элементов TreeView Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
б) в HierarchyDataTemplate нужно указать источник дочерних объектов Код: xml 1. 2. 3. 4. 5. 6.
Код: xml 1. 2. 3. 4. 5. 6.
в) для TreeView нужно в свойстве ItemsSource указать источник (коллекцию объектов 1ого уровня) Код: xml 1. 2. 3.
Так как объекты производные от базового типа могут отображаться по разному, (такие как class FolderObject : FileSystemObject {} class FileObject : FileSystemObject {}). Можно использовать DataTemplateSelector для свойства ItemTemplateSelector. Тогда шаблон папки будет отличаться от шаблона файла. Так же в DataTemplate'ах работают триггеры и можно как угодно менять состояние объектов. Да и биндингу всё равно, но лучше делать каждый шаблон под отдельный тип. p.s. код делал на коленке, приболел, нужна доп. реализация, копипаст работать 100% не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 12:51 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Roman Mejtes, Спасибо! Натолкнул на мысль, что можно с DataTemplateSelector поиграть. Накидал следующее: C# DataSet Код: 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.
DataTemplateSelector Код: 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.
XAML Код: xml 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.
Все замечательно, только не могу понять почему DataTemplate не отображает листья дерева. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 18:45 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Пример с файловой системой не совсем удачный, но структура именно такая и 4 разных DataTemplate будет использоваться ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 18:50 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Очень не хотелось переходить на коллекции... В общем перделал проект, все работает на ура, спасибо! Теперь появился вопрос как отследить какой из элементовы выбрал пользователь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2017, 00:32 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Читали эту статью? https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2017, 22:44 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Rocketeer88888Читали эту статью? https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode Там в том числе говориться и о том, как отследить выбранный элемент. Пользователь может выбрать элемент и код будет об этом знать. А можно в коде выбрать элемент, и пользователь увидит разворот выбранного элемента меню. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2017, 23:04 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Rocketeer88888Rocketeer88888Читали эту статью? https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode Там в том числе говориться и о том, как отследить выбранный элемент. Пользователь может выбрать элемент и код будет об этом знать. А можно в коде выбрать элемент, и пользователь увидит разворот выбранного элемента меню. у всех этой идеи есть некоторые недостатки, я бы даже сказал баги. На счет TreeView я сейчас не скажу, врать не буду, на сколько я помню выделенный элемент в нём не виртуализируется, но точно я уже не помню. Я уже описывал ситуацию с таким подходом, вот просто пример: 1) В ListBox делает такой же стиль для элементов с Binding'ом IsSelected к модели элементов. 2) Выделяем элемент А 3) Через ICollectionView отфильтровываем элемент 4) Выделяем элемент Б Так как в момент выделения элемента А не существовало (во View) то и свойство IsSelected не изменилось, в результате мы имеем 2 выделенных элемента, хотя выбрали SingleSelection и так косячат абсолютно все ItemsControl'ы, коим является TreeView. Было бы на много разумнее весь код отвечающий за выделение элементов перенести в ICollectionView и контролировать его там, тогда бы мы имели возможность управлять выделением и из View и из ViewModel. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2017, 09:55 |
|
Помогите разметку XAML для treeview сделать
|
|||
---|---|---|---|
#18+
Roman MejtesЯ уже описывал ситуацию с таким подходом, вот просто пример: 1) В ListBox делает такой же стиль для элементов с Binding'ом IsSelected к модели элементов. 2) Выделяем элемент А 3) Через ICollectionView отфильтровываем элемент 4) Выделяем элемент Б Так как в момент выделения элемента А не существовало (во View) то и свойство IsSelected не изменилось, в результате мы имеем 2 выделенных элемента, хотя выбрали SingleSelection и так косячат абсолютно все ItemsControl'ы, коим является TreeView. Было бы на много разумнее весь код отвечающий за выделение элементов перенести в ICollectionView и контролировать его там, тогда бы мы имели возможность управлять выделением и из View и из ViewModel. Ничего не понял. У меня были простые тривью, выполненные по подходу в статье, но двух выделенных у меня не было. Какой-то специальный случай? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2017, 14:29 |
|
|
start [/forum/topic.php?fid=21&fpage=9&tid=1440567]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 186ms |
0 / 0 |