powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
12 сообщений из 12, страница 1 из 1
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168403
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица. В ней записи вида
ID, Name, FK
где FK указывает на другую запись в этой-же таблице.
Использую Entity Framework. Таблица загружается в ObservableCollection, для работающего binding'а

Не получается отобразить в виде дерева в DataGrid или в TreeView, и что-бы биндинг сохранить(не уходить от ObservableCollection, которую получаю из DataContext).
Пробовал такой вариант:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<TreeView ItemsSource="{Binding Repairs}" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Stretch" Margin="2,2,0,0" Name="treeView1" VerticalAlignment="Stretch" >
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Repair1}" DataType="{x:Type model:Repair}">
                    <StackPanel Orientation="Horizontal">
                        <TextBox Text="{Binding Code}" />
                        <TextBox Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>


Repairs - коллекция объектов типа Repair
Repair1 - ссылка на объект родитель(навигационное свойство)
Repairs1 - коллекция дочерних объектов

Вот сгенеренный Entity Framework'ом класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public partial class Repair
    {
        public Repair()
        {
            this.Repairs1 = new ObservableCollection<Repair>();
        }
    
        public decimal Code { get; set; }
        public string Name { get; set; }
        public Nullable<decimal> FK_RepairGroup { get; set; }
        public bool IsGroup { get; set; }
    
        public virtual ObservableCollection<Repair> Repairs1 { get; set; }
        public virtual Repair Repair1 { get; set; }
    }



Но записи дублируются, т.к. кроме как в коллекции дочерних объектов(Repairs1) они имеются и в основной коллекции Repairs

Может кто делал, подскажет куда копать, или может пример даст?
Спасибо
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168442
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть 2 пути:
а) для TreeView нужна иерархическая структура, там как там применяются иерархические шаблоны
HierarchicalDataTemplate, документации по этой фигне гора и маленькая тележка
суть в том, чтоб был класс аля
Код: c#
1.
2.
3.
4.
5.
6.
class BaseTreeItem
{
public bool IsExpanded { set; get; }
public bool IsSelected { set; get; }
IEnumerable<BaseTreeItem> Children { set;get; }
}



б) более интересный вариант как по мне, у меня еще руки не дошли, замутить такое, но можешь попробовать.
Фишка вся в интерфейсе ICollectionChanged, создаем коллекцию, которая создается на базе плоского списка.
При этом коллекция должна возвращать не саму коллекцию, а только набор обёрток в которых будут свойства IsExpanded и Depth (которая понадобится нам для создания отступа).
Когда у элемента IsExpanded значение становится True, мы вызываем событие CollectionChanged и передаем туда список вложенных элементов, а началом указываем номер родительского элемента + 1, то есть мы как бы вставим в ItemsControl набор элементов вложенного списка.
Для того, чтоб это было похоже на дерево на основе свойства Depth, делаем отступ от левого края.
В результате мы получим ItemsControl, который будет поддерживать вертикальную виртуализацию, иметь древовидную форму и раскрывающиеся элементы.
+ нужно запилить метод перечислитель, который будет возвращать коллекцию в которой будет все элементы в плоском виде, главное их последовательность, сперва идет родитель, потом если родитель открыт его дети и так рекурсивно для всех.

должно быстро работать, так как при вызове CollectionChanged коллекция не будет обновляться, просто будут в ItemsControl вставляться в нужное место, нужные элементы :)

если руки дойдут сделать это, могу скинуть сюда код :)
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168456
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман, а зачем мутить свое дерево на базе ItemsControl, если TreeView - оно фактически и есть?
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168612
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу первого пути.
По иерархическим шаблонам я почитал доку, выше я привел код, который получился(xaml).
Но проблемма в дублировании элементов.
Использую Entity Framework. Он генерит DBset Repairs. У каждого элемента есть навигационное свойство с массивом указывающих на него элементов(Repairs1 у меня в примере).

Получается в итоге такое:
http://postimage.org/][img] http://s11.postimg.org/fgzf6bl5v/image.jpg [/img]

Все элементы и подгруппы присутствуют в таблице в единичном экземпляре. Почему дублируются понятно. Но как-бы это объяснить TreeView...
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168631
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно делать привязку корня не непосредственно к коллекции всех узлов, а только к коллекции корневых узлов. Например к Linq-выражению .Where(n => Repair1==null)
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168664
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, я бы не стал привязывать дерево напрямую (или через IQueryable) к DbSet-у. Так как свойство навигации будет загружаться по требованию, получится масса обращений к базе данных (для каждого узла), что может внести заметные тормоза. Если не требуется Lazy-поведение, то лучше перегрузить все дерево в свой лист и привязаться к нему.
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168757
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

причин много, TreeView это по сути своей набор ItemsControl'ов, каждый элемент дерева (TreeViewItem) является ItemsControl'ом, который содержит свой набор элементов, в результате мы получаем кучу ItemsControl'ов, которые вложены друг в друга.
У каждого ItemsControl'а есть свой шаблон, ItemsPresenter и прочее. Виртуализация организована в TreeView, не так как в ItemsControl'е очень замороченная, я даже не стал вникать, так как там треш полнейший.
Соотвественно, переход на один ItemsControl отображающий дерево должен уменьшить визуальное дерево, будет работать с обычной панелью виртуализации или даже своей собственной.
Думаю будут и минусы, например routed events и routed commands не будут всплывать через всё дерево, с сразу улетать на ItemsControl.
В общем надо пробовать, идея есть, времени реализовать её нет :(
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39168775
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно. Если руки дойдут, поделись опытом, если не будет лень! ))
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39174716
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


вот какие результаты, делается всё с помощью 1 класса ну и стили элементов надо несколько подшаманить, чтоб всё было красиво.
+ в том, что работает с любым ItemsControl'ом, то есть иерархию можно добавить практически куда угодно.
На 2ой пикче это не стандартный контрол, самопал
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39174792
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очепятка "Callapse All"

А исходники за деньги?
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39174869
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proочепятка "Callapse All"

А исходники за деньги?
потом накатаю отдельную тему
еще пока не оттестировали это дело, доработок уже сколько сделал с момента скрина. Когда будет всё готово, включая документацию, тогда может и сорцы будут :)
...
Рейтинг: 0 / 0
Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
    #39175009
mishanya3624
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БАТЬКО!:)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как отобразить плоский список в виде дерева в DataGrid или TreeView(WPF, C#)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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