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

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

15.02.2024, 12:32. Показов 1881. Ответов 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,746
Записей в блоге: 3
24.02.2024, 17:53
Цитата Сообщение от sergey2129 Посмотреть сообщение
у Operation нет вложенных других Operations.
Смутило вот это:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 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,746
Записей в блоге: 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,746
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru