|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Есть таблица. В ней записи вида ID, Name, FK где FK указывает на другую запись в этой-же таблице. Использую Entity Framework. Таблица загружается в ObservableCollection, для работающего binding'а Не получается отобразить в виде дерева в DataGrid или в TreeView, и что-бы биндинг сохранить(не уходить от ObservableCollection, которую получаю из DataContext). Пробовал такой вариант: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Repairs - коллекция объектов типа Repair Repair1 - ссылка на объект родитель(навигационное свойство) Repairs1 - коллекция дочерних объектов Вот сгенеренный Entity Framework'ом класс: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Но записи дублируются, т.к. кроме как в коллекции дочерних объектов(Repairs1) они имеются и в основной коллекции Repairs Может кто делал, подскажет куда копать, или может пример даст? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 12:04 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
есть 2 пути: а) для TreeView нужна иерархическая структура, там как там применяются иерархические шаблоны HierarchicalDataTemplate, документации по этой фигне гора и маленькая тележка суть в том, чтоб был класс аля Код: c# 1. 2. 3. 4. 5. 6.
б) более интересный вариант как по мне, у меня еще руки не дошли, замутить такое, но можешь попробовать. Фишка вся в интерфейсе ICollectionChanged, создаем коллекцию, которая создается на базе плоского списка. При этом коллекция должна возвращать не саму коллекцию, а только набор обёрток в которых будут свойства IsExpanded и Depth (которая понадобится нам для создания отступа). Когда у элемента IsExpanded значение становится True, мы вызываем событие CollectionChanged и передаем туда список вложенных элементов, а началом указываем номер родительского элемента + 1, то есть мы как бы вставим в ItemsControl набор элементов вложенного списка. Для того, чтоб это было похоже на дерево на основе свойства Depth, делаем отступ от левого края. В результате мы получим ItemsControl, который будет поддерживать вертикальную виртуализацию, иметь древовидную форму и раскрывающиеся элементы. + нужно запилить метод перечислитель, который будет возвращать коллекцию в которой будет все элементы в плоском виде, главное их последовательность, сперва идет родитель, потом если родитель открыт его дети и так рекурсивно для всех. должно быстро работать, так как при вызове CollectionChanged коллекция не будет обновляться, просто будут в ItemsControl вставляться в нужное место, нужные элементы :) если руки дойдут сделать это, могу скинуть сюда код :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 12:32 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Роман, а зачем мутить свое дерево на базе ItemsControl, если TreeView - оно фактически и есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 12:45 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
По поводу первого пути. По иерархическим шаблонам я почитал доку, выше я привел код, который получился(xaml). Но проблемма в дублировании элементов. Использую Entity Framework. Он генерит DBset Repairs. У каждого элемента есть навигационное свойство с массивом указывающих на него элементов(Repairs1 у меня в примере). Получается в итоге такое: http://postimage.org/][img] http://s11.postimg.org/fgzf6bl5v/image.jpg [/img] Все элементы и подгруппы присутствуют в таблице в единичном экземпляре. Почему дублируются понятно. Но как-бы это объяснить TreeView... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 14:30 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Нужно делать привязку корня не непосредственно к коллекции всех узлов, а только к коллекции корневых узлов. Например к Linq-выражению .Where(n => Repair1==null) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 14:44 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
А вообще, я бы не стал привязывать дерево напрямую (или через IQueryable) к DbSet-у. Так как свойство навигации будет загружаться по требованию, получится масса обращений к базе данных (для каждого узла), что может внести заметные тормоза. Если не требуется Lazy-поведение, то лучше перегрузить все дерево в свой лист и привязаться к нему. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 15:02 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Shocker.Pro, причин много, TreeView это по сути своей набор ItemsControl'ов, каждый элемент дерева (TreeViewItem) является ItemsControl'ом, который содержит свой набор элементов, в результате мы получаем кучу ItemsControl'ов, которые вложены друг в друга. У каждого ItemsControl'а есть свой шаблон, ItemsPresenter и прочее. Виртуализация организована в TreeView, не так как в ItemsControl'е очень замороченная, я даже не стал вникать, так как там треш полнейший. Соотвественно, переход на один ItemsControl отображающий дерево должен уменьшить визуальное дерево, будет работать с обычной панелью виртуализации или даже своей собственной. Думаю будут и минусы, например routed events и routed commands не будут всплывать через всё дерево, с сразу улетать на ItemsControl. В общем надо пробовать, идея есть, времени реализовать её нет :( ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 16:30 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Ясно. Если руки дойдут, поделись опытом, если не будет лень! )) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2016, 16:40 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
вот какие результаты, делается всё с помощью 1 класса ну и стили элементов надо несколько подшаманить, чтоб всё было красиво. + в том, что работает с любым ItemsControl'ом, то есть иерархию можно добавить практически куда угодно. На 2ой пикче это не стандартный контрол, самопал ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 19:38 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
очепятка "Callapse All" А исходники за деньги? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 21:57 |
|
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
|
|||
---|---|---|---|
#18+
Shocker.Proочепятка "Callapse All" А исходники за деньги? потом накатаю отдельную тему еще пока не оттестировали это дело, доработок уже сколько сделал с момента скрина. Когда будет всё готово, включая документацию, тогда может и сорцы будут :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 03:25 |
|
|
start [/forum/topic.php?fid=21&msg=39168403&tid=1440725]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
70ms |
get forum data: |
5ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 342ms |
0 / 0 |