Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/74: Рейтинг темы: голосов - 74, средняя оценка - 4.82
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771

MVVM postgres

17.06.2020, 10:41. Показов 17425. Ответов 200
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
учу mvvm
появилось много вопросов
я создал модель
Кликните здесь для просмотра всего текста

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
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
public  class GlavTables:INotifyPropertyChanged
    {
        public int id { get; set; }
        private DateTime _dateCreating;
        private string _dateTara;
        private string _dateBrutto;
        private string _dateRegistration;
        private double _tara;
        private double _brutto;
        private double _netto;
        private string _typeScales;
        private string _transportNumber;
        private string _driver;
        private string _trailer;
        private string _post;
        private string _product;
        private string _sender;
        private string _payer;
        private string _consignee;
        private string _user;
        private bool _chakRegistration;
        private bool _chakBlok;
        
        public  DateTime dateCreating
        {
            get { return _dateCreating; }
            set
            {
                if (_dateCreating == value)
                    return;
 
                _dateCreating = value;
                OnPropertyChanget("dateCreating");
 
            }
        }
        public string dateTara
        {
            get {return _dateTara; }
            set
            {
                if (_dateTara == value)
                    return;
 
                _dateTara = value;
                OnPropertyChanget("dateTara");
 
            }
        }
        public string dateBrutto
        {
            get { return _dateBrutto; }
            set
            {
                if (_dateBrutto == value)
                    return;
 
                _dateBrutto = value;
                OnPropertyChanget("dateBrutto");
 
            }
        }
        public string dateRegistration
        {
            get { return _dateRegistration; }
            set
            {
                if (_dateRegistration == value)
                    return;
 
                _dateRegistration = value;
                OnPropertyChanget("dateRegistration");
 
            }
        }
        public double tara
        {
            get { return _tara; }
            set
            {
                if (_tara == value)
                    return;
 
                _tara = value;
                OnPropertyChanget("tara");
 
            }
        }
        public double brutto
        {
            get { return _brutto; }
            set
            {
                if (_brutto == value)
                    return;
 
                _brutto = value;
                OnPropertyChanget("brutto");
 
            }
        }
        public double netto
        {
            get { return _netto; }
            set
            {
                if (_netto == value)
                    return;
 
                _netto = value;
                OnPropertyChanget("netto");
 
            }
        }
        public string typeScales
        {
            get { return _typeScales; }
            set
            {
                if (_typeScales == value)
                    return;
 
                _typeScales = value;
                OnPropertyChanget("typeScales");
 
            }
        }
        public string transportNumber
        {
            get { return _transportNumber; }
            set
            {
                if (_transportNumber == value)
                    return;
 
                _transportNumber = value;
                OnPropertyChanget("transportNumber");
 
            }
        }
        public string driver
        {
            get { return _driver; }
            set
            {
                if (_driver == value)
                    return;
 
                _driver = value;
                OnPropertyChanget("driver");
 
            }
        }
        public string trailer
        {
            get { return _trailer; }
            set
            {
                if (_trailer == value)
                    return;
 
                _trailer = value;
                OnPropertyChanget("trailer");
 
            }
        }
        public string post
        {
            get { return _post; }
            set
            {
                if (_post == value)
                    return;
 
                _post = value;
                OnPropertyChanget("post");
 
            }
        }
        public string product
        {
            get { return _product; }
            set
            {
                if (_product == value)
                    return;
 
                _product = value;
                OnPropertyChanget("product");
 
            }
        }
        public string sender
        {
            get { return _sender; }
            set
            {
                if (_sender == value)
                    return;
 
                _sender = value;
                OnPropertyChanget("sender");
 
            }
        }
        public string payer
        {
            get { return _payer; }
            set
            {
                if (_payer == value)
                    return;
 
                _payer = value;
                OnPropertyChanget("payer");
 
            }
        }
        public string consignee
        {
            get { return _consignee; }
            set
            {
                if (_consignee == value)
                    return;
 
                _consignee = value;
                OnPropertyChanget("consignee");
 
            }
        }
        public string user
        {
            get { return _user; }
            set
            {
                if (_user == value)
                    return;
 
                _user = value;
                OnPropertyChanget("user");
 
            }
        }
        public bool chakRegistration
        {
            get { return _chakRegistration; }
            set
            {
                if (_chakRegistration == value)
                    return;
 
                _chakRegistration = value;
                OnPropertyChanget("chakRegistration");
 
            }
        }
        public bool chakBlok
        {
            get { return _chakBlok; }
            set
            {
                if (_chakBlok == value)
                    return;
 
                _chakBlok = value;
                OnPropertyChanget("chakBlok");
 
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanget(string propertyName="")
        {
           
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

создал сервис , который должен заполнять данными я это сделал так
Кликните здесь для просмотра всего текста

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
 public BindingList<GlavTables> LoadData()
        {
            try
            {
                string conn = "Server=192.168.1.111;Port=5432;User Id=postgres;Password=123;Database=postgres111";
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                string sql = " SELECT * FROM \"glav\" ";
                NpgsqlConnection ConnLocal = new NpgsqlConnection(conn);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, ConnLocal);
                da.Fill(ds);
                BindingList<GlavTables> glavTavles = new BindingList<GlavTables>();
                for (int i=0; ds.Tables[0].Rows.Count > i;i++)
                {
                    glavTavles.Add(new GlavTables
                {
                    
                    id = Convert.ToInt32(ds.Tables[0].Rows[i][0].ToString()),
                    dateCreating = Convert.ToDateTime(ds.Tables[0].Rows[i][2].ToString()),
                    dateTara = ds.Tables[0].Rows[i][3].ToString(),
                    dateBrutto = ds.Tables[0].Rows[i][4].ToString(),
                    dateRegistration = ds.Tables[0].Rows[i][5].ToString(),
                    tara = nullNo(ds.Tables[0].Rows[i][6].ToString()),
                    brutto = nullNo(ds.Tables[0].Rows[i][7].ToString()),
                    netto = nullNo(ds.Tables[0].Rows[i][8].ToString()),
                    typeScales = ds.Tables[0].Rows[i][11].ToString(),
                    transportNumber = ds.Tables[0].Rows[i][12].ToString(),
                    driver = ds.Tables[0].Rows[i][13].ToString(),
                    trailer = ds.Tables[0].Rows[i][14].ToString(),
                    post = "Пост1",
                    product = ds.Tables[0].Rows[i][16].ToString(),
                    sender = ds.Tables[0].Rows[i][17].ToString(),
                    payer = ds.Tables[0].Rows[i][18].ToString(),
                    consignee = ds.Tables[0].Rows[i][19].ToString(),
                    user = ds.Tables[0].Rows[i][20].ToString(),
                    chakRegistration = true,
                    chakBlok = false
                
                });
                }
                return glavTavles;
            }
            catch
            {  return null; }
        }

после чего в основном классе
Кликните здесь для просмотра всего текста

C#
1
2
3
 GlavTablesIOServices glavTablesIOServices = new GlavTablesIOServices();
            _glavTables = glavTablesIOServices.LoadData();
            dg_glavGrid.ItemsSource = _glavTables;

и тут первый вопрос. можно это сделать без циклов ? например сразу конвертировать в BindingList и как вообще правильно заполнять данными из бд?

дальше я показываю таблицу в view
Кликните здесь для просмотра всего текста

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
 <DataGrid 
 
                x:Name="dg_glavGrid" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=id}" IsReadOnly="True" Header="№"/>
                    <DataGridTextColumn Binding="{Binding Path=dateCreating}" IsReadOnly="True" Header="Дата создания"/>
                    <DataGridTextColumn Binding="{Binding Path=dateTara}" IsReadOnly="True" Header="Дата тара"/>
                    <DataGridTextColumn Binding="{Binding Path=dateBrutto}" IsReadOnly="True" Header="Дата брутто"/>
                    <DataGridTextColumn Binding="{Binding Path=dateRegistration}" IsReadOnly="True" Header="Дата оформления"/>
                    <DataGridTextColumn Binding="{Binding Path=tara}" IsReadOnly="True" Header="Тара"/>
                    <DataGridTextColumn Binding="{Binding Path=brutto}" IsReadOnly="True" Header="Брутто"/>
                    <DataGridTextColumn Binding="{Binding Path=netto}" IsReadOnly="True" Header="Нетто"/>
                    <DataGridTextColumn Binding="{Binding Path=typeScales}" IsReadOnly="True" Header="Тип весов"/>
                    <DataGridTextColumn Binding="{Binding Path=transportNumber}" IsReadOnly="True" Header="Т/С"/>
                    <DataGridTextColumn Binding="{Binding Path=driver}" IsReadOnly="True" Header="Водитель"/>
                    <DataGridTextColumn Binding="{Binding Path=trailer}" IsReadOnly="True" Header="Прицеп"/>
                    <DataGridTextColumn Binding="{Binding Path=post}" IsReadOnly="True" Header="Имя поста"/>
                    <DataGridTextColumn Binding="{Binding Path=product}" IsReadOnly="True" Header="Товар"/>
                    <DataGridTextColumn Binding="{Binding Path=sender}" IsReadOnly="True" Header="Отправитель"/>
                    <DataGridTextColumn Binding="{Binding Path=payer}" IsReadOnly="True" Header="Плательщик"/>
                    <DataGridTextColumn Binding="{Binding Path=consignee}" IsReadOnly="True" Header="Получатель"/>
                    <DataGridTextColumn Binding="{Binding Path=user}" IsReadOnly="True" Header="Пользователь"/>
                    <DataGridCheckBoxColumn Binding="{Binding Path=chakRegistration, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Header="Оформление"/>
                    <DataGridCheckBoxColumn Binding="{Binding Path=chakBlok, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Header="Доступность"/>
                </DataGrid.Columns>
            </DataGrid>
 
        </Grid>
 
    </Grid>

и снова вопрос. мне нужно добавлять данные в BindingList и при событии добавления/удаления/изменения делать изменения в бд? Или просто делать запросы в бд update/insert и после этого заново заполнять данными? второе звучит проще и логичней для меня.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.06.2020, 10:41
Ответы с готовыми решениями:

Mvvm
Форумчане помогите разобраться есть простенькая модель public partial class Category:ViewModelBase { private int...

x:Name в MVVM
Добрый день, как обращаться к объектам из VM по их x:Name? Например, у меня есть канвас в который я докидываю картинки по нажатию...

MVVM
Здравствуйте, я в среде WPF нахожусь очень мало, посмотрел книжки, решил читать Мэтью Макдональда, стоит ли мне сразу изучать MVVM или...

200
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
20.03.2021, 23:53
Лучший ответ Сообщение было отмечено onimor как решение

Решение

Цитата Сообщение от onimor Посмотреть сообщение
учу mvvm
появилось много вопросов
Хоть запоздало, но тема без одного ответа.
Так, что отвечу хоть и частично.

Сначала общей теории по MVVM.
Модель - это слой содержащий Бизнес Логику.
А не просто контейнер для данных.
Если смотреть на ваш код, то GlavTables - это контейнер для данных или сущность данных.
Но ни как не Модель.
И такой мутабельный тип с INPC обычно используют только на уровне ViewModel и View.

Если в приложении присутствует некий функционал по работе хранилищем (локальный файл, БД, Web и т.д.), то его принято выделять в отдельный слой - Репозиторий (Данных).

Общая иерархия приложения в таком случае выглядит так: View -> ViewModel -> Model -> Репозиторий -> Хранилище.

Добавлено через 4 минуты
Цитата Сообщение от onimor Посмотреть сообщение
создал сервис , который должен заполнять данными я это сделал так
Вот этот сервис - это уровень Репозитория.
В MVVM самым удобным способом работы с БД является EF.
Пусть он не настолько универсален, но он очень сильно упрощает работу с БД и делает это максимально близким к принятому в Шарпе виду.
В очень редких случаях потребности превышают возможности EF и приходится использовать иные приёмы работы с БД.

Добавлено через 6 минут
Цитата Сообщение от onimor Посмотреть сообщение
и тут первый вопрос. можно это сделать без циклов ? например сразу конвертировать в BindingList и как вообще правильно заполнять данными из бд?
А зачем?
Посмотрите выше на иерархию приложения MVVM+БД.
С базой работает у вас Репозиторий.
А привязку к коллекции нужно сделать в View - это на другой стороне иерархии.
Никакой прямой передачи коллекции из Репозитория в View в правильно построенном MVVM не должно возникать.

Вот посмотрите ещё полезные ссылки:
Структура WPF решения
Структура WPF+БД решения
Потоки в асинхронном MVVM

Добавлено через 3 минуты
Цитата Сообщение от onimor Посмотреть сообщение
и снова вопрос. мне нужно добавлять данные в BindingList и при событии добавления/удаления/изменения делать изменения в бд?
Никак!
Если вы делаете MVVM приложение, то любые действия в UI вызывают только команды ViewModel.
ViewModel собирает все необходимые данные и вызывает метод модели.
Будут ли в результате этих действий изменены данные не знает ни View, ни ViewModel.
Если данные изменятся, то Модель создаст событие.
И по этому событию обновятся ViewModel и View.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 08:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В MVVM самым удобным способом работы с БД является EF.
Спасибо за ответ. я уже во многом разобрался и далеко продвинулся в плане MVVM. У pg кстати есть свой EF для core. Скоро до него дойду
Очень мельком смотрел. как я понял все переходит в работу с коллекциями вместо запросов. У меня сразу возникло 2 вопроса , возможно зная ef они могут показаться тупыми , погуглив я конечно смогу найти ответы , но раз уж мы тут .

1) добавились данные в коллекцию или изменились , ui это отобразил . вызываем метод SaveChanges() , но произошла ошибка. Что происходит ? Нужно удалять изменения ? При обычном раскладе у меня было: уехал insert запрос, после чего обновилась коллекция.

2) если в базе 1ккк записей то у меня в коллекции тоже будет 1ккк? Или там можно как-то отфильтровать по той же дате , чтоб не все забирать ?

И ещё вопрос касательно MVVM . Нормальная ли практика при инициализации view и контекста данных для нее (допустим отобразить UserCotrol нужно) передавать vm основного окна в vm UC, для того чтоб использовать при необходимости методы основной vm из UC

Добавлено через 8 минут
Или это знак не правильной архитектуры приложения?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 10:48
Цитата Сообщение от onimor Посмотреть сообщение
1) добавились данные в коллекцию или изменились , ui это отобразил . вызываем метод SaveChanges() , но произошла ошибка. Что происходит ? Нужно удалять изменения ? При обычном раскладе у меня было: уехал insert запрос, после чего обновилась коллекция.
Есть различные алгоритмы работу WPF GUI.
Парочка их них:
1) Самый простой и наиболее часто используемый.
Для изменения данных есть отдельные кнопки: добавить, удалить, редактировать.
По нажатию на них выполняется команда VM.
В команде происходит вызов метода Модели.
Если в результате действия метода, будут изменения данных, в том числе удаление/добавление элементов коллекции, то Модель создаёт событие.
VM ловит это событие и обновляет свои данные.
Фактически реализуется два независимых канала.
Один для передачи данных из Модели в View, второй для передачи действий в GUI в Модель.

2) Способ БД отражается (представляется) в DataGrid и изменения DataGrid должны сразу передаваться в БД.
Если подобный интерфейс реализовывать в MVVM здесь возникает проблема "отлова" изменений в строке.
Для каждой строки в VM создана своя сущность.
Если в предыдущем способе сущность - это простейший контейнер практически без логики.
То в этом случае, такой простой контейнер не подойдёт.
Необходимо как-то синхронизировать изменения сущности с записью в БД.
Можно это сделать передав Модель в каждую сущность и наделив сущность возможность самостоятельно сохранять свои Данные. Фактически сущности мы превращаем в маленькие самостоятельные VM.
Можно передать в сущность делегат для команды на сохранение данных. Здесь сущность приобретает функционал вложенной (дочерней) VM.
Можно в VM подписаться на события изменения и/или конца редактирования сущности и весь функционал по работе с БД останется в VM.
Мне больше нравится последний подход.

Добавлено через 2 минуты
Цитата Сообщение от onimor Посмотреть сообщение
2) если в базе 1ккк записей то у меня в коллекции тоже будет 1ккк? Или там можно как-то отфильтровать по той же дате , чтоб не все забирать ?
В EF, вроде, можно забирать нужный диапазон коллекции.
Но мне это не было нужно, поэтому, наверняка, сказать не могу.
Но здесь надо как-то связывать виртуализацию коллекции с запросами к БД.
Это отельная и большая тема.

Добавлено через 5 минут
Цитата Сообщение от onimor Посмотреть сообщение
И ещё вопрос касательно MVVM . Нормальная ли практика при инициализации view и контекста данных для нее (допустим отобразить UserCotrol нужно) передавать vm основного окна в vm UC, для того чтоб использовать при необходимости методы основной vm из UC
Обычно, если есть в подобном необходимость, это делается через реализацию нескольких интерфейсов в одной VM.
Каждый UC представляет свой интерфейс, хотя и получает в Контексте Данных одby и тот же экземпляр VM.

Также возможно, что вы не вполне верно разделяете функционал View и VM, и из-за этого у вас появляется неспецифическая для MVVM задача.
Какие методы основной VM и для чего нужны в дочерней?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 11:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Какие методы основной VM и для чего нужны в дочерней?
К примеру в основном окне я использую DialogHost от Material Design
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
 <materialDesign:DialogHost IsOpen="{Binding VisibleDialog}" >
 
        <materialDesign:DialogHost.DialogContent >
          
                <StackPanel  Margin="16">
                    <Label Margin="3"
                               Content="{Binding TextDialog}"
                               HorizontalAlignment="Center" />
 
                    <ProgressBar Style="{StaticResource MaterialDesignCircularProgressBar}"
                                         Value="0"
                                         HorizontalAlignment="Center"
                                         Margin="3"  
                                         IsIndeterminate="{Binding VisibleDialogLoad}" />
                    <Button Style="{StaticResource MaterialDesignFlatButton}"
                                IsCancel="False"
                                Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}"
                                HorizontalAlignment="Center"
                                IsEnabled="{Binding VisibleDialogButton}" 
                                Visibility="{Binding VisibleDialogButton,  Converter={StaticResource BoolToHiddenConverter}}">
                        OK
                    </Button>
                </StackPanel>
 
        </materialDesign:DialogHost.DialogContent>
         <!--Тут основной контент окна-->
 </materialDesign:DialogHost>
Использую я его чтоб показать какую либо ошибку, либо анимацию загрузки
Сделал 3 метода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public void DialogLoad(string message)
        {
            TextDialog = message;
            VisibleDialogButton = false;
            VisibleDialogLoad = true;
            VisibleDialog = true;
        }
        public void DialogMessage(string message)
        {
            TextDialog = message;
            VisibleDialogButton = true;
            VisibleDialogLoad = false;
            VisibleDialog = true;
        }
        public void DialogClose()
        {
            TextDialog = "";
            VisibleDialogButton = false;
            VisibleDialogLoad = false;
            VisibleDialog = false;
           
            
        }
Используя их я могу показывать какие либо сообщения или уведомления пользователю.
При этом весь остальной контент затемняется и не доступен
Так вот чтоб использовать эти методы я передаю в дочернюю VM(допустим UC настроек) текущую VM, чтобы при сохранении или проверке настроек можно было выводить уведомления использую эти методы.

Еще в дальнейшем будет класс для работы с COM портом его будут использовать как минимум 3 VM если в каждой его инициализировать то будет ошибка так как com порт уже открыт и используется. Планировалось передавать уже инициализированный класс в разные VM
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 12:29
onimor, на первый взгляд, мне кажется вам надо в разные VM передавать одну и туже модель, а не ссылки друг на друга.

Допустим, вся работа с Com портов относится к уровню Модели или даже Репозитория.
Зачем VM, вообще, знать что-либо о COM поре. Ей даже не нужно знать, что это СОМ порт или какой-то локальный файл.
VM должна знать только Модель, её методы и события.
Вызвала метод Модели получила результат метода.
А как модель получила этот результат... зачем эти детали VM?

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
Используя их я могу показывать какие либо сообщения или уведомления пользователю.
При этом весь остальной контент затемняется и не доступен
Так вот чтоб использовать эти методы я передаю в дочернюю VM(допустим UC настроек)
Мне не хватает деталей для конкретного ответа.
Допустим, как эти методы связаны с остальными членами основной VM?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 13:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Допустим, вся работа с Com портов относится к уровню Модели или даже Репозитория.
репозитория
Но ведь там будут методы для отправки и получения данных, которые будет юзать vm чтобы показать в view
чтоб их использовать придется либо передать либо инициализировать этот класс в VM.
все время открывать и закрывать com не вариант , они будут каждую секунду получать данные и в рандомное время отправлять. просто не будет успевать открыться и закрыться

Добавлено через 17 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Мне не хватает деталей для конкретного ответа.
если вы скажите свой логин на гите я могу добавить вас в приватны репозиторий
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 14:04
Цитата Сообщение от onimor Посмотреть сообщение
Но ведь там будут методы для отправки и получения данных, которые будет юзать vm чтобы показать в view
Методы репозитория использует Модель.
Для VM Репозиторий неизвестен.
VM использует методы Модели.
Модель (так же как и VM, и Репозиторий) - это СЛОЙ приложения.
И необязательно, что этот слой реализован в одном типе и одном экземпляре.

Каждая VM получает в конструкторе Модель (один объект или несколько - неважно).
Разные VM могут получать одни и те же объекты Модели.
И если VM нужно обратиться к Данным, то она это делает через полученный экземпляр Модели, а не через другую VM.

Добавлено через 3 минуты
Цитата Сообщение от onimor Посмотреть сообщение
чтоб их использовать придется либо передать либо инициализировать этот класс в VM.
Инициализацией слоёв и внедрением зависимостей занимается App (Приложение).
App - это самый верхний слой приложения и он не включается в паттерн MVVM.
Этот слой лежит над всеми остальными и "знает" обо всех остальных.
Посмотрите схему здесь: Реализация MVVM с несколькими разными хранилищами данных
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 14:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И если VM нужно обратиться к Данным, то она это делает через полученный экземпляр Модели, а не через другую VM.
в случае с com портом так и получается
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 14:06
Цитата Сообщение от onimor Посмотреть сообщение
если вы скажите свой логин на гите я могу добавить вас в приватны репозиторий
EldHasp

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
в случае с com портом так и получается
Тогда тем более непонятно как возникла задача передачи одной VM ссылки на другую.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 14:12  [ТС]
а в случае с главным окном и диалогом.
получается есть главное окно.
в нем контейнер(диалог , который вызывают 3 метода), в котором уже находится все остальное остальное.
все остальное это разные UC , которым тоже нужно пользоваться этим диалогом

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
EldHasp
там 2 пользователя . тот где такой же аватар?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 14:19
Цитата Сообщение от onimor Посмотреть сообщение
там 2 пользователя . тот где такой же аватар?
Как два?
Два не может быть - Гит не даёт двух одинаковых создать.
Аватар такой же - задал недавно.
Может второй этот тот же ник, но без аватара (аватар по умолчанию).

Добавлено через 1 минуту
Приглашение получил и принял.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 14:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как два?
не знаю. пригласил
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 14:31
onimor, только открыл решение и сразу вам советую его изменить.
Вы только осваиваете MVVM и вам до конца не понятны границы в разделении функционалов слоёв.
Поэтому настоятельно советую каждый слой реализовывать в отдельно проекте.
Я вас дал выше ссылку на схему архитектуры.
Вот в ней: каждый блок (прямоугольник) - это отдельный проект.
А стрелка - это ссылка из одного проекта на другой.

Единственное исключение можно сделать для App и View.
Их можно реализовать в одном проекте.
Но надо следить за тем чтобы в View были ссылки только на типы из библиотеки.
на остальные проекты может ссылаться только App.

Добавлено через 35 секунд
Цитата Сообщение от onimor Посмотреть сообщение
не знаю. пригласил
Я уже и принял и сделал локальный клон.

Добавлено через 3 минуты
Цитата Сообщение от onimor Посмотреть сообщение
там 2 пользователя
Второй, наверное, EldHasp WpfMvvm.
Это тоже мой ник, но он под отдельный проект Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп]
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 14:34  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
только открыл решение и сразу вам советую его изменить.
все на столько плохо?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому настоятельно советую каждый слой реализовывать в отдельно проекте.
завтра попробую все отдельно сделать
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 14:42
onimor, у вас в SettingVM намешан функционал как самой VM, так и Модели и даже частично репозитрия.
Поэтому для другой VM она выступает в качестве Модели.

Это, конечно, нарушение MVVM, но иногда так делается в случаях когда в таком типе полностью инкапсулирована своя независимая цепочка VM-> Model -> Репозиторий и по факту практически отсутствует Бизнес Логика.

Единственно, что настоятельно советую - переходите на EF для работы с БД.
Сами себе создаёте проблемы которые потом героически преодалеваете.

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
все на столько плохо?
Это не сколько плохо - сколько запутывает вас самого.
Когда наберётесь опыта, то для простых задача будете делать однопроектные решения.
Но сейчас вам надо разобраться где проходят границы слоёв, а в однопроектном Решении это очень трудно понять.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 15:02  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
переходите на EF для работы с БД.
да я уже к нему и хотел перейти , но видимо теперь не скоро )

Добавлено через 7 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
у вас в SettingVM намешан функционал как самой VM, так и Модели и даже частично репозитрия.
из-за того что там собирается строка коннекта и запускается тест коннекта?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 15:06
Цитата Сообщение от onimor Посмотреть сообщение
из-за того что там собирается строка коннекта и запускается тест коннекта?
Да.

Добавлено через 39 секунд
Цитата Сообщение от onimor Посмотреть сообщение
да я уже к нему и хотел перейти , но видимо теперь не скоро )
Почему?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 15:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почему?
пока буду разделять проект

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я вас дал выше ссылку на схему архитектуры.
в схеме "общая библиотека" выступает в роли связующего звена между всеми слоями?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,137
Записей в блоге: 2
21.03.2021, 15:33
Цитата Сообщение от onimor Посмотреть сообщение
в схеме "общая библиотека" выступает в роли связующего звена между всеми слоями?
Да.

Добавлено через 39 секунд
В реальном приложение это может быть несколько библиотек.
Но пока всё сделайте через одну.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2021, 15:33
Помогаю со студенческими работами здесь

MVVM
Добрый день! Пытаюсь написать программу в стиле MVVM. Вопрос такой: как передать SelectedItem TreeView из xaml с помощью Binding в...

Model в MVVM
Доброго времени суток. Начал изучать MVVM и даже что-то получается сделать, но не могу сообразить, что должно быть в Model? Программа...

Mvvm datagrid ef
Здравствуйте форумчане, у меня такая проблема есть приложение При выделении datagrid биндю Selecteditem в textboxы мои ...

WPF MVVM
Привет всем! Изучаю патерн MVVM. Не могу понять как реализовать ее, если допустим мне необходимо одно и тоже окно использовать для разных ...

MVVM патерн
Всем привет. Уже писал по поводу данного стиля программирования, более менее разобрался, но некоторые вещи не понятны. Допустим у меня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru