Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 11

XAML. Иерархические модели для разных типов объектов

15.02.2024, 12:32. Показов 1867. Ответов 35
Метки wpf, xaml (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую! Столкнулся с такой задачей, над которой ломаю голову уже который день. Имеется следующая модель:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Part
{
    public int ID {get; set;}
    ... //Другие свойства
    public ObservableCollection<Part> Parts {get; set;}
    public ObservableCollection<Operation> Operations {get; set;}
}
 
public class Operation
{
    public int ID {get; set;}
    ... //Другие свойства
}
Так вот не могу разобраться с разметкой XAML. Использую TreeView для оформления иерархии объектов:

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
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<UserControl x:Class="Therminal.Forms.PDO.SomeForms.PDO_PartTreeControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Therminal.Forms.PDO.SomeForms"
         xmlns:partModels="clr-namespace:Therminal.Forms.PDO.StructurePart"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
 
 
 
<UserControl.Resources>
 
</UserControl.Resources>
 
 
<TreeView x:Name="treeView1" Margin="2" BorderThickness="0" PreviewMouseRightButtonDown="Grid_PreviewMouseRightButtonDown"
              SelectedValuePath="ID" Grid.ColumnSpan="2">
 
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
 
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                </Trigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
 
 
 
    <TreeView.ItemTemplate >
        <HierarchicalDataTemplate ItemsSource="{Binding Parts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DataType="{x:Type partModels:Part_PDO}">
            <Grid  Height="20"  MouseLeftButtonDown="Grid_MouseLeftButtonDown" PreviewMouseLeftButtonDown="PreviewMLBDown" Background="#FF37A0BF">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30"/>
                    <ColumnDefinition Width="Auto" MinWidth="150"/>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="60"/>
                </Grid.ColumnDefinitions>
 
                <Border Grid.Column="0" Grid.Row="0" Width="Auto" Background="{Binding Color}" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding ShortPartName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="1" Grid.Row="0" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Left" Margin="5,0,5,0" VerticalAlignment="Center"  
                                   Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="2" Grid.Row="0" Width="Auto" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Left" Margin="5,0,5,0" VerticalAlignment="Center" MaxWidth="200"
                                   Text="{Binding BlueprintName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="3" Grid.Row="0" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="4" Grid.Row="0" Background="{Binding PartVariantColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding OperationAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
                <Border Grid.Column="5"  Grid.Row="0" Background="{Binding DistributedColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding DistributedAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="6" Grid.Row="0" Background="{Binding SupermarketItemColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="60" 
                                   Text="{Binding SupermarketItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Grid.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Перенести" Click="Send_MenuItem_Click"/>
                        <MenuItem Header="Проверить операции" Click="CheckOperations_MenuItem_Click_1"/>
                        <Separator/>
                        <MenuItem Header="Удалить" Click="Delete_MenuItem_Click_1"/>
                        <MenuItem Header="Назначить Шаблон" Click="MenuItem_Click"/>
                    </ContextMenu>
                </Grid.ContextMenu>
            </Grid>
 
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
Получаю следующий результат:


В разрезе деталей - всё отлично. Но при добавлении еще одного шаблона по типу объекта - выходит чушь. Мне нужно, чтобы каждый элемент Part можно было развернуть иерархию Operations. Где-то на просторах данного ресурса нашел пот такой вариант разметки 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
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<UserControl x:Class="Therminal.Forms.PDO.SomeForms.PDO_PartTreeControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Therminal.Forms.PDO.SomeForms"
         xmlns:partModels="clr-namespace:Therminal.Forms.PDO.StructurePart"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
 
 
 
<UserControl.Resources>
 
</UserControl.Resources>
 
 
<TreeView x:Name="treeView1" Margin="2" BorderThickness="0" PreviewMouseRightButtonDown="Grid_PreviewMouseRightButtonDown"
              SelectedValuePath="ID" Grid.ColumnSpan="2">
 
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
 
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                </Trigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
 
 
 
    <TreeView.ItemTemplate >
        <HierarchicalDataTemplate ItemsSource="{Binding Parts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DataType="{x:Type partModels:Part_PDO}">
            <Grid  Height="20"  MouseLeftButtonDown="Grid_MouseLeftButtonDown" PreviewMouseLeftButtonDown="PreviewMLBDown" Background="#FF37A0BF">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30"/>
                    <ColumnDefinition Width="Auto" MinWidth="150"/>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="60"/>
                </Grid.ColumnDefinitions>
 
                <Border Grid.Column="0" Grid.Row="0" Width="Auto" Background="{Binding Color}" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding ShortPartName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="1" Grid.Row="0" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Left" Margin="5,0,5,0" VerticalAlignment="Center"  
                                   Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="2" Grid.Row="0" Width="Auto" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Left" Margin="5,0,5,0" VerticalAlignment="Center" MaxWidth="200"
                                   Text="{Binding BlueprintName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="3" Grid.Row="0" Background="Silver" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="4" Grid.Row="0" Background="{Binding PartVariantColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding OperationAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
                <Border Grid.Column="5"  Grid.Row="0" Background="{Binding DistributedColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="40" 
                                   Text="{Binding DistributedAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Border Grid.Column="6" Grid.Row="0" Background="{Binding SupermarketItemColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  BorderThickness="1" BorderBrush="Black">
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" MaxWidth="60" 
                                   Text="{Binding SupermarketItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Border>
 
                <Grid.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Перенести" Click="Send_MenuItem_Click"/>
                        <MenuItem Header="Проверить операции" Click="CheckOperations_MenuItem_Click_1"/>
                        <Separator/>
                        <MenuItem Header="Удалить" Click="Delete_MenuItem_Click_1"/>
                        <MenuItem Header="Назначить Шаблон" Click="MenuItem_Click"/>
                    </ContextMenu>
                </Grid.ContextMenu>
            </Grid>
 
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Operations, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DataType="{x:Type partModels:Operation_PDO}">
                    <Grid Height="20">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="40"/>
                            <ColumnDefinition Width="150"/>
                            <ColumnDefinition Width="150"/>
                            <ColumnDefinition Width="150"/>
                            <ColumnDefinition Width="40"/>
                        </Grid.ColumnDefinitions>
 
                        <Border Grid.Column="0" Grid.Row="0" Width="Auto" Background="#FFC7A76F" BorderThickness="1" BorderBrush="Black">
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding ID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
 
                        <Border Grid.Column="1" Grid.Row="0" Width="Auto" Background="#FFC7A76F" BorderThickness="1" BorderBrush="Black">
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding District, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
 
                        <Border Grid.Column="2" Grid.Row="0" Width="Auto" Background="#FFC7A76F" BorderThickness="1" BorderBrush="Black">
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding OperationName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
 
                        <Border Grid.Column="3" Grid.Row="0" Width="Auto" Background="#FFC7A76F" BorderThickness="1" BorderBrush="Black">
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding OperationPlace, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
 
                        <Border Grid.Column="4" Grid.Row="0" Width="Auto" Background="#FFC7A76F" BorderThickness="1" BorderBrush="Black">
                            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  
                                   Text="{Binding OperationsAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Border>
 
                    </Grid>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
и вот получаемы результат:


Мне же нужно, чтобы у каждого Part, в котором есть Operations были эти желтые строчки, но и оставалась так же структура Part Прошу помощи разобраться во всем этом
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2024, 12:32
Ответы с готовыми решениями:

Как создать список для объектов разных типов данных
Здравствуйте, подскажите, пожалуйста, у меня есть задание: Создать базовый класс «Транспорт» и несколько производных от него классов :...

Хранение объектов разных типов в контейнере
Добрый день. Требуется реализовать контейнер, который хранит объекты разных типов. Есть две мысли. 1. Воспользоваться полиморфизмом. Мы...

Динамическое добавление объектов разных типов
Цель следующая, хочу сделать что-то вроде категорий (лейблы) и подкатегорий(чекбоксы). TStringList* Sections = new TStringList; ...

35
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 17:50
Студворк — интернет-сервис помощи студентам
sergey2129, кроме работы с БД, ещё какая-то Бизнес Логика есть?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,745
Записей в блоге: 3
24.02.2024, 17:53
Цитата Сообщение от sergey2129 Посмотреть сообщение
у Operation нет вложенных других Operations.
Смутило вот это:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,745
Записей в блоге: 3
24.02.2024, 17:57

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Бизнес Логика есть
бизнес есть, логики.... логики нет ))



Добавлено через 1 минуту
Цитата Сообщение от wizard41 Посмотреть сообщение
Смутило вот это:
А, все. Дошло...
0
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 11
24.02.2024, 18:08  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
кроме работы с БД, ещё какая-то Бизнес Логика есть?
Именно с Part? Operation? или вообще?
Но да по сути со всеми этими объектами есть Бизнес Логика... на основе всех сущностей, что тут были описаны есть та или иная логика. Например: на основе Part - составляется структура продукта (будь-то уникальная, либо серийка), в основе PartInfo лежат описания не только самой детали, но и сопутствующие материалы, расходники и т.п., на их основе составляются ведомости и пр.

За всё время я перепробовал несколько моделей хранения и загрузки этих объектов: к примеру были и сущности типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Part
{
   pulic int ID {get; set;}
   public List<PartLink> PartLinks {get; set;}
}
 
public class PartLink
{
   public int ID {get; set;}
   public int ParentPartID {get; set;}
   public int CurrentpartID {get; set;}
}
Сущности довольно примерные.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 18:22
sergey2129, есть требования по безопасности разработки?
Например, что сущности Контекста БД не должны покидать Репозиторий?

Добавлено через 2 минуты
Используете ли Lazy loading?
0
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 11
24.02.2024, 18:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
есть требования по безопасности разработки?
Например, что сущности Контекста БД не должны покидать Репозиторий?
Вообще пока нет, на данном этапе отдельные сущности не представляют особой ценности... я бы сказал, что важна именно их компоновка (структура)..
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 18:36
wizard41, Привязка WPF к свойствам навигации.

Добавлено через 4 минуты
Цитата Сообщение от sergey2129 Посмотреть сообщение
Вообще пока нет, на данном этапе отдельные сущности не представляют особой ценности... я бы сказал, что важна именно их компоновка (структура)..
В таком случае, что мешает удерживать сущности в контексте БД всё время сеанса приложения и прокидывать их до вьюхи?

Добавлено через 3 минуты
Для начала (тестовый пример), созадайте Code First БД с сущностями:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Part
{
    public int Id {get; set;}
    public int? ParentId  {get; set;}
    public string Title {get; set;}
}
 
public class Operation
{
    public int Id {get; set;}
    public int PartId  {get; set;}
    public string Title {get; set;}
}
Больше ничего не нужно.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,745
Записей в блоге: 3
24.02.2024, 18:38
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Привязка WPF к свойствам навигации
Да, я в курсе про такие конструкции. Но где-то видел и контр-пример, где достаточно серьезно объяснялись минусы такого подхода. Хотя, наверное, тут многое зависит от конкретной задачи и конкретной структуры данных.
И да, там было что-то вроде: "заменить объект целиком в ObservableCollection обходится дешевле чем изменить его свойства отдельно".
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 18:39
Логика такая что для ParentId == null - это сущности верхнего уровня.
Так же нужно задать проверку ParentId на существование в БД (и если "потянете" - отсутствие зацикливаний).

Добавлено через 39 секунд
Проверки нужно задавать в самой БД, чтобы она сама следила за целостностью своих данных.
0
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 11
24.02.2024, 18:40  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Используете ли Lazy loading?
Дело в том, что для некоторых операций мне не требуется загружать дополнительные данные. К примеру:

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
public class PartInfo
{
  public int ID {get; set;}
  public Blueprint {get; set;}
  public List<PartVariation> PartVariations {get;set;}
 
///
...
//
}
 
 
public class PartVariation
{
   public int ID {get; set;}
//
...
//
public virtual List<PartInfo> PartInfos {get; set;}
}
 
...
var pi = new Context().PartInfos
             .Include(x=>x.Blueprint)
             .FirstOrDefault(x=>x.ID == 154);
Загружает PartInfo только с сущностью Blueprint но без PartVariations, так как в текущей логике они незачем. Так я создаю отношения Многие-ко-многим... и тут так же могу загрузить PartVariation как и просто со свойствами, так и отдельно с привязками PartInfo.
это как вариант... не знаю, понятно ли я объяснил
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 18:47
Как отладите эту часть для небольших БД, в Part нужно будет добавить несохраняемые свойства IsSelected и IsExpanded.
В Репозиторий метод прогрузки свзяанных сущностей для указанного Part.
При поднятии IsSelected и IsExpanded - вызывать этот метод.

Добавлено через 3 минуты
Цитата Сообщение от sergey2129 Посмотреть сообщение
Дело в том, что для некоторых операций мне не требуется загружать дополнительные данные. К примеру:
Есть какие-то основные данные необходимые всегда.
Они должны быть в основных таблицах Parts и Operations. Данные из них грузятся всегда.
А есть ещё дополнительные таблицы из которых данные будут грузиться "по требованию". Это уже другая тема.
В текущей теме мы рассматриваем только вопрос древовидного представления основных данных БД.
0
0 / 0 / 0
Регистрация: 15.02.2024
Сообщений: 11
24.02.2024, 18:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
При поднятии IsSelected и IsExpanded - вызывать этот метод.
То есть добавлять в выделенный объект дочерние при раскрытии - как вариант, надо бы попробовать. Спасибо за наводку.
Ну а по поводу Преставления, что писал с самого начала, вопрос остается открытым. Под описанием детали всё-таки необходим раскрывающийся список Операций
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 19:11

Не по теме:

sergey2129, какой-то сбой был у вас при отправке сообщения - не было видно текста, только цитата.
Я отрезал какие-то спецсимволы после список Операций - стал виден текст сообщения.



Добавлено через 2 минуты
Цитата Сообщение от sergey2129 Посмотреть сообщение
Под описанием детали всё-таки необходим раскрывающийся список Операций
Это не проблема.
В дереве будут участвовать только Part. А в контенте Part раскрывающийся список Operation.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,745
Записей в блоге: 3
24.02.2024, 19:15
Цитата Сообщение от sergey2129 Посмотреть сообщение
То есть добавлять в выделенный объект дочерние при раскрытии - как вариант
Я бы сделал что-то вроде пагинации. Но добавлять сами объекты не прям в момент раскрытия, а всем видимым в клиентской области. VirtualizingStackPanel с режимом Mode=Recycling тут явно к месту.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.02.2024, 19:23
Цитата Сообщение от sergey2129 Посмотреть сообщение
То есть добавлять в выделенный объект дочерние при раскрытии - как вариант, надо бы попробовать. Спасибо за наводку.
Немного по другому.
Есть только общие ObservableCollection для Part и Operation. Никаких вложенных коллекций не будет.
Нужные сущности будут извлекать CollectionViewSource по фильтру указанного Id.

Подгрузка cущностей будет происходить в локальный кеш контекста БД.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А в контенте Part раскрывающийся список Operation.
Для этого тоже можно в Part добавить ещё свойство IsExpandedOperations.

Добавлено через 3 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
Но где-то видел и контр-пример, где достаточно серьезно объяснялись минусы такого подхода.
Согласен.
Поэтому и написал про взвешенный и обдуманный подход к такому способу реализации.
1
 Аватар для Andrey-MSK
3390 / 2276 / 388
Регистрация: 14.08.2018
Сообщений: 7,696
Записей в блоге: 4
26.02.2024, 08:35
Цитата Сообщение от sergey2129 Посмотреть сообщение
и для того, чтобы загрузить одно дерево уходит в районе 40-50 сек
Проверьте запрос который генерирует EF. Он там может такого нагенерировать что волосы дыбом встанут, даже там где их нет...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2024, 08:35

Сериализация списка объектов разных типов в json
В программе имеются классы Abstract Mammals{} Cat:Mammals{} Dog:Mammals{} Собрал List&lt;Mammals&gt; в котором имеются объекты и Cat's и...

Как создать список из объектов разных типов
У меня есть абстрактный класс Desk. От него наследуются классы EconomDesk и BusinessDesk. Нужно создать List, чтобы он мог содержать...

Как создать массив из объектов разных типов
Привет, интересует такая проблема: У меня есть абстрактный класс, от которого наследуются классы и потом создаются объекты этих классов....

Сереализация нескольких объектов разных типов в один файл
Имеются 3 списка разных типов. List &lt;A&gt; obj1, List&lt;B&gt; obj2 , List&lt;C&gt; obj3. BinaryFormatter bf = new BinaryFormatter(); ...

Простое создание строки из объектов разных типов данных
Всем доброго времени суток. Создал класс, который (по моему мнению) сделает более удобным создание строк и их передачу в функции,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru