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

MVVM postgres

17.06.2020, 10:41. Показов 18713. Ответов 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
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
21.03.2021, 18:10  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но пока всё сделайте через одну.
как тогда в VM сделать Command для биндинга в View если VM не знает ни о чем и только библиотека вкурсе всех дел

я на гите в этом же репозитории ветку новую сделал где все в отдельных проектах
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.03.2021, 19:06
Цитата Сообщение от onimor Посмотреть сообщение
как тогда в VM сделать Command для биндинга в View если VM не знает ни о чем и только библиотека вкурсе всех дел
Обо всех знает ещё и App.
В библиотеке находится интерфейс VM.
VM его реализует.
View получает VM через интерфейс.
При запуске приложения App (если несколько реализаций интерфейса) выбирает нужную реализацию интерфейса, создаёт её экземпляр, внедряет в него экземпляр Модели, потом создаёт экземпляр View (окна или окон) и передаёт ему экземпляр VM.
В том числе это реализуется через Локатор в реcурсах App.
Свойства Локатора - это отдельные VM или иные контейнеры для данных доступ к которым может получить напрямую любой WPF UI компонент.

Одна из возможных реализаций Локатора: 2. Передача данных через экземпляр класса, создание и использование Локаторов.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
21.03.2021, 19:07
Цитата Сообщение от onimor Посмотреть сообщение
только библиотека вкурсе всех дел
Внесу небольшую поправку.
Библиотека напротив - ничего ни о ком не знает.
Есть только ссылки НА НЕЁ.
То есть все знают о ней, но ей ни о ком знать не нужно.
И подобные циклические зависимости в Студии нельзя создавать в принципе.
Это тоже является одной из причин по которой интерфейсы, базовые типы, типы для данных должны быть вынесены в отдельную библиотеку (или библиотеки).
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 14:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В библиотеке находится интерфейс VM.
VM его реализует.
View получает VM через интерфейс.
При запуске приложения App (если несколько реализаций интерфейса) выбирает нужную реализацию интерфейса, создаёт её экземпляр, внедряет в него экземпляр Модели, потом создаёт экземпляр View (окна или окон) и передаёт ему экземпляр VM.
В том числе это реализуется через Локатор в реcурсах App.
Свойства Локатора - это отдельные VM или иные контейнеры для данных доступ к которым может получить напрямую любой WPF UI компонент.
Одна из возможных реализаций Локатора: 2. Передача данных через экземпляр класса, создание и использование Локаторов.
чет я вообще запутался каша какая то
что должно быть в библиотеке?сейчас там :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace LibraryAll
{
 
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "")
        {
            if (EqualityComparer<T>.Default.Equals(storage, value))
                return false;
            storage = value;
            this.OnPropertyChanged(propertyName);
            return true;
        }
    }
}
чтоб vm наследовалась от нее

хотя я думаю проще на гите посмотреть все что нужно

вообщем я запутался еще больше с схемой этой, ссылкой на проект с локатором и вашим описанием. не складывается общая картина в голове
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 15:36
onimor, ветка SplitProjectTest?
Посмотрю в течение дня.

Добавлено через 12 минут
onimor, проверьте мои права.
Не могу отправить промежуточную фиксацию.
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 15:55  [ТС]
Да , она.
Сейчас, минутку

Добавлено через 7 минут
я добавил вас как Collaborators. по сути это полный доступ

Добавлено через 18 секунд
странно что не работает

Добавлено через 8 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не могу отправить промежуточную фиксацию.
разрешены все действия. А что пишет?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:03
Цитата Сообщение от onimor Посмотреть сообщение
разрешены все действия. А что пишет?
Сейчас нормально отправилось.

Добавлено через 2 минуты
onimor, поэтапно давайте разбираться - я же не знаю вашего Решения.
Начнём с класса
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
    public class BDClass
    {
        /// <summary>
        /// путь до проекта
        /// </summary>
        private static string path = AppDomain.CurrentDomain.BaseDirectory;
 
        /// <summary>
        /// названия файла с базой
        /// </summary>
        private static string _settingName = "setconpro.sqlite";
 
        /// <summary>
        /// фул путь до базы
        /// </summary>
        private string FullPatch = $"{path}{_settingName}";
 
        /// <summary>
        /// проверяем есть ли база и таблицы если нет создаем и базу и таблицы
        /// </summary>
        /// <returns></returns>
        private bool chakDB()
        {
            string FullPatch = $"{path}{_settingName}";
            try
            {
                if (!File.Exists(FullPatch))
                    SQLiteConnection.CreateFile(FullPatch);
 
                SQLiteCommand _slqLitCmd = new SQLiteCommand();
                SQLiteConnection _slqLitConn = new SQLiteConnection($"Data Source={FullPatch};Version=3;");
                _slqLitConn.Open();
                _slqLitCmd.Connection = _slqLitConn;
 
                //таблица с настройками
                _slqLitCmd.CommandText = "CREATE TABLE IF NOT EXISTS setting (ip TEXT, port TEXT, dbname TEXT, localog TEXT, localpas TEXT,online TEXT,onlinelog TEXT,onlinepas TEXT)";
                _slqLitCmd.ExecuteNonQuery();
 
               
 
 
 
                return true;
            }
            catch /*(SQLiteException ex)*/
            {
 
                return false;
            }
        }
 
        #region io настройки
 
        /// <summary>
        /// получить настройки
        /// </summary>
        /// <returns></returns>
        public List<string> TakeSetting()
        {
 
            using (var _slqLitConn = new SQLiteConnection($"Data Source={FullPatch};Version=3;"))
            {
 
                if (chakDB())
                {
                    List<string> ls = new List<string>();
 
                    string sqlQuery = "SELECT * FROM setting";
 
                    DataSet _slqLitDS = new DataSet();
                    DataTable _slqLitDT = new DataTable();
                    try
                    {
 
                        using (var adapter = new SQLiteDataAdapter(sqlQuery, _slqLitConn))
                        {
 
                            adapter.Fill(_slqLitDT);
                            if (_slqLitDT.Rows.Count != 0)
                            {
                                for (int i = 0; i < _slqLitDT.Columns.Count; i++)
                                {
                                    ls.Add(_slqLitDT.Rows[0][i].ToString() ?? "");
                                }
 
                            }
 
                            return ls;
                        }
 
                    }
                    catch /*(SQLiteException ex)*/
                    {
 
                        return ls;
                    }
 
                }
                else
                {
                    return null;
                }
            }
 
        }
 
        /// <summary>
        /// сохранить настройки
        /// </summary>
        /// <param name="ls"></param>
        public void SaveSetting(List<string> ls)
        {
 
            if (ls.Count != 0)
            {
                if (chakDB())
                {
                    List<string> res = new List<string>();
                    foreach (string _ls in ls)
                    {
                        res.Add(_ls ?? "");
                    }
 
 
                    using (var _slqLitConn = new SQLiteConnection($"Data Source={FullPatch};Version=3;"))
                    {
                        _slqLitConn.Open();
                        using (var _slqLitCmd = new SQLiteCommand())
                        {
                            _slqLitCmd.CommandText = "DELETE FROM Setting;";
                            _slqLitCmd.Connection = _slqLitConn;
                            _slqLitCmd.ExecuteNonQuery();
                            _slqLitCmd.CommandText = null;
 
                            _slqLitCmd.CommandText = $"INSERT INTO Setting ('ip', 'port', 'dbname', 'localog', 'localpas','online','onlinelog','onlinepas') values" +
                              $" ('{ res[0]}' , '{ res[1]}' ,'{ res[2]}' ,'{ res[3]}' ,'{ res[4]}','{ res[5]}' ,'{ res[6]}' ,'{ res[7]}')";
 
                            _slqLitCmd.ExecuteNonQuery();
                            _slqLitConn.Close();
                        }
                    }
 
                }
 
            }
        }
 
        #endregion
    }
Добавлено через 1 минуту
Поля path, _settingName и FullPatch - создаются один раз в экземпляре и больше не меняются?
Это постоянные на всё время жизни приложения?
Или в ходе установки, поддержки приложения могут меняться?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Начнём с класса
работает с sqlite .
chakDB() - если базы или таблиц нет то создает их.
TakeSetting() - возвращает List с настройками , которые берет и таблицы
SaveSetting()- Принимает List и Сохраняет в таблицу настройки заменяя текущую запись
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:07
По сути только два публичных метода: получить и сохранить настройки.
Почему настройки это просто список строк?
Как-то очень необычно.
Чаше бывает словарь: ключ (string) - значение (object, string или уже конкретный конечный тип).
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:08  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поля path, _settingName и FullPatch - создаются один раз в экземпляре и больше не меняются?
да. как запустили , так оно не меняется
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:09
Я пока логику трогать не буду - только связи.

Добавлено через 1 минуту
Цитата Сообщение от onimor Посмотреть сообщение
да. как запустили , так оно не меняется
Это я понял.
Но допустим, вы кому-то устанавливаете эту программу, могут там понадобится другие значения?
Или это константы на всю вечность?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Или это константы на всю вечность?
да. они себе установили, файл создался и используется всегда рядом с exe

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чаше бывает словарь: ключ (string) - значение (object, string или уже конкретный конечный тип).
очень старые настройки, пока для теста. их переделать планировалось , но позже
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:21
onimor, а где используется класс BDClass?

Добавлено через 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 class Models
    {
 
        public string Ip { get; set; }
        public string Port { get; set; }
        public string DBName { get; set; }
        public string LocaLog { get; set; }
        public string Online { get; set; }
        public string OnlineLog { get; set; }
        public string OnlinePass { get; set; }
 
        public List<Models> LoadSetting()
        {
            List<Models> setting = new List<Models>();
            setting.Add(new Models
            {
                Ip = "awd",
 
            });
            return setting;
        }
 
    }
Кроме загрузки настроек каким-либо образом их использует?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:29  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
а где используется класс BDClass?
если помните ветку dev это класс SQLiteDBWork, который использует SettingVM

в текущей ветке Model-> ViewModel

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Кроме загрузки настроек каким-либо образом их использует?
да , он делает connection string для postgres из этих настроек и запускает проверку соединения и проверку, что все таблицы присутствуют

Добавлено через 2 минуты
из класса postgres, которого там пока нет
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
internal class PGDBWork
    {
        /// <summary>
        /// строка коннекта для локальной базы
        /// </summary>
        public static string LocalDBConnectString { get; set; }
 
        /// <summary>
        /// строка конекта для онлайн базы
        /// </summary>
        public static string OnlineDBConnectString { get; set; }
 
        /// <summary>
        /// проверка подключения к базе, проверка наличия всех таблиц
        /// </summary>
        /// <returns></returns>
        public bool ChackDBConnection()
        {
 
            List<string> ls = new List<string>
            {
              "users"
            };
 
            using (var conn = new NpgsqlConnection(LocalDBConnectString))
            {
                foreach (var item in ls)
                {
                    var sql = $"SELECT * FROM {item} WHERE ID = '1'";
 
                    using (var da = new NpgsqlDataAdapter(sql, conn))
                    {
                        var ds = new DataSet();
                        da.Fill(ds);
                    }
 
                }
            }
 
            return true;
 
        }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:34
Цитата Сообщение от onimor Посмотреть сообщение
да , он делает ...
Вот выше в классе Models свойства, что за данные содержат?
Для одного порта?

Просто какая-то несуразица на первый взгляд.
Models содержит метод который возвращает список Models ни как не связанных с ней...

Добавлено через 1 минуту
И почему все свойства строковые?

Добавлено через 1 минуту
Допустим, для Ip есть класс IPAddress.
Почему его не используете?
0
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Models содержит метод который возвращает список Models ни как не связанных с ней...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 private BDClass bDClass;
 
        public Models()
        {
            bDClass = new BDClass();
        }
        public void LoadSetting()
        {
 
            List<string> ls = bDClass.LoadSetting();
            PGDBWork.LocalDBConnectString = $@"Server={ ls[0]};Port={ ls[1] };User Id={ls[2]};Password={ls[3]};Database={ls[4]}";
            if (_pGDBWork.ChackDBConnection())
            {
             
            }
            else
            {
              
            }
        }
Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Допустим, для Ip есть класс IPAddress.
Почему его не используете?
я пока пытался сложить общую картину в голове. толком ничего нет в классах
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 16:45
Цитата Сообщение от onimor Посмотреть сообщение
я пока пытался сложить общую картину в голове. толком ничего нет в классах
Ок!
Я тогда просто общую структуру для понимания сделаю.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 16:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я тогда просто общую структуру для понимания сделаю.
хорошо, спасибо. Тогда после этого перенесу все что есть уже с пониманием , а не кашей.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.03.2021, 18:06
onimor, сделал фиксацию:
Демонтсрации структуры WPF MVVM приложения.
Все зависимости внедряются только в App.
Посмотрите.
1
96 / 76 / 25
Регистрация: 18.02.2016
Сообщений: 771
22.03.2021, 19:30  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Посмотрите.
даже не знаю как вас отблагодарить.
пока изучаю, завтра буду пробовать перенести все из ветки dev
вместо мсчбоксов в репозитории должны быть события, которые будут уведомлять model , которая будет уведомлять vm , чтоб показать диалог?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2021, 19:30

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru