Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
UWP

Разбор MVVM подхода с использованием API и Json

04.02.2022, 21:07. Показов 9486. Ответов 126
Метки mvvm, uwp (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток,

Как уже писал, перехожу на подход MVVM и сталкиваюсь с проблемами, шерстил форум, но не нашел подходящие решение для моего случая. Очень буду благодарен за помощь.

Логика следующая, пользователей вводит номер телефона, по апи идет запрос и я получаю ответ в виде JSON, и если JSON приходит в response, то панель с смс должна появится. Если номер не правильный то приходит в error значение.

Проблема вот в чем. Как мне вернуть данные из Model в ViewModel, не используя статический класс или свойство ? Да в принципе, как правильно управлять данными которые пришли в model и передать их в Viewmodel на примере JSON.


View:
XML
1
2
3
4
5
6
7
                        <StackPanel>
                            <TextBox x:Uid="Phone" Text="{x:Bind onsignVM.user_login,Mode=TwoWay}" />
                            <StackPanel Visibility="{x:Bind responsesignVM.visibilitysmstextblock, Mode=OneWay}" >
                                <TextBox x:Uid="SmsText"  />
                            </StackPanel>
                            <Button  x:Uid="SignSms" Click="{x:Bind onsignVM.Poke}"  />
                        </StackPanel>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using Test.ViewModels;
 
namespace Test.Views
{
    public sealed partial class Sign : Page
    {
        public Sign()
        {
            InitializeComponent();
        }
 
    public AuthorizationTest onsignVM { get; } = new AuthorizationTest();
    public LoginformTest responsesignVM { get; } = new LoginformTest();
 
}
}
ViewModel:

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
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text.Json;
using Test.Models;
using Windows.Storage;
using Windows.UI.Xaml;
 
namespace Test.ViewModels
{
    public class SignVM
    {
 
 
    }
 
    public class LoginformTest : INotifyPropertyChanged
    {
        private int _error { get; set; }
        private string _response { get; set; }
        private Visibility _visibilitysmstextblock { get; set; }
 
        public Visibility visibilitysmstextblock
        {
            get { return _visibilitysmstextblock = _response == null ? Visibility.Collapsed : Visibility.Visible; }
            set { _visibilitysmstextblock = value; OnPropertyChanged("visibilitycountnewtoday"); }
        }
        public int error 
        {
            get { return _error; }
            set { _error = value; OnPropertyChanged("error"); }
        }
        public string response 
        {
            get { return _response; }
            set { _response = value; OnPropertyChanged("response"); }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
 
 
 
 
 
    public class AuthorizationTest : INotifyPropertyChanged
    {
        
        private string _user_login { get; set; }
        private string _hwid { get; set; }
        private string _device { get; set; }
 
        public string user_login
        {
            get { return _user_login; }
            set { _user_login = value; OnPropertyChanged("user_login"); }
        }
        public string hwid
        {
            get { return _hwid; }
            set { _hwid = value; OnPropertyChanged("hwid"); }
        }
        public string device
        {
            get { return _device; }
            set { _device = value; OnPropertyChanged("device"); }
        }
 
 
        public void Poke()
        {
            ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
            ApplicationDataCompositeValue Settings = (ApplicationDataCompositeValue)localSettings.Values["Settings"];
 
            AuthorizationTest postData = new AuthorizationTest
            {
                user_login = this.user_login,
                hwid = (string)Settings["Hwid"],
                device = (string)Settings["Device"],
            };
 
 
            byte[] data = JsonSerializer.SerializeToUtf8Bytes(postData);
 
           SignM.Connect(data);
    }
 
 
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
 
 
 
}
}
Model:

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
using Test.ViewModels;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.UI.Xaml.Controls;
 
namespace Test.Models
{
    public class SignM
    {
        public static LoginformTest RootStatic { get; set; }
 
        public static void Connect(byte[] data)
        {
            ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
            ApplicationDataCompositeValue Settings = (ApplicationDataCompositeValue)localSettings.Values["Settings"];
 
            HttpWebResponse response;
            try
            {
 
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(Settings["UriAPI"] + "/user/auth"));
                request.Method = "POST";
                request.Headers.Add("CLIENTKEY", (string)Settings["Test"]);
                request.ContentType = "application/json";
                request.ContentLength = data.Length;
 
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
 
                /// This will have statii from 200 to 30x
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                /// Statii 400 to 50x will be here
                response = (HttpWebResponse)ex.Response;
            }
 
            if (response != null)
            {
 
                using (StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                {
                    try
                    {
                        RootStatic = JsonSerializer.Deserialize<LoginformTest>(stream.ReadToEnd());
 
                    }
 
                    catch (JsonException ex)
                    {
 
                    }
                }
  
            }
 
            else
            {
 
            }
 
        }
 
    }
}
Чего я хочу добиться, чтобы дессериализация происходила в LoginformTest и от полученых данных появлялась панель или нет, с блоком для ввода смс. За это отвечает _visibilitysmstextblock. Помимо этого, я понимаю, что в Model не должно быть статических свойств, как мне вызывать connect без статики из ViewModel ?

Так же я понимаю, что возможно здесь ошибки подхода MVVM, любые поправки с теплотой приму
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2022, 21:07
Ответы с готовыми решениями:

Вывод данных JSON в консоль с использованием API токена
Вечер в хату, форумчане! Мне нужно вытащить данные с сервера с помощью API токена и вывести их на консоль, с данной темой столкнулся...

Создание программ с использованием структурного подхода
Привет всем, помогите пожалуйста решить любую из задачек: Сведения об ученике состоят из его имени, фамилии и названия класса (года...

Напишите программу (с использованием ООП подхода)
Напишите программу (с использованием ООП подхода), что отвечает следующим требованиям: • Пользователь вводит интервал (например, ). •...

126
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 21:44
Студворк — интернет-сервис помощи студентам
Ihave, фиксацию с типовой передачей параметра скинул тоже в новую ветку.

Добавлено через 1 минуту
Цитата Сообщение от Ihave Посмотреть сообщение
так как буквально недавно накатил себе Windows 11...
У меня комп старый (10 лет точно есть) и опасаюсь одиннадцатую не потянет.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 22:40  [ТС]
Элд Хасп,

Такс понизил сборку до Windows 10. Обновил реп 3e1ffe3 и закомментировал лишние.

Я понимаю, что вчерашними своими действиями вас запутал, забыл закомментировать, но давайте просто сосредоточемся только пока на Sign без News и тд. Я поменял, то что вы просили в ToDo, однако обьекты не связываются. Тоесть Sing.xaml не связан с SignVM, не обновляет и не получает данные. Я получаю ошибку при взаимодействии с кнопкой.

Как я понял и VM и M ДОЛЖНЫ быть Net 2.0 оболочкой ?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня комп старый (10 лет точно есть) и опасаюсь одиннадцатую не потянет.
Даа такая же 10, только в новой обертке я бы не переходил, но как то так получилось...

Добавлено через 10 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
фиксацию с типовой передачей параметра скинул тоже в новую ветку.
Так вроде ваша вторая фиксация работает на отлично, тестирую...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 22:58
Цитата Сообщение от Ihave Посмотреть сообщение
Как я понял и VM и M ДОЛЖНЫ быть Net 2.0 оболочкой ?
Не обязательно.
В данном случае сделал так, чтобы у вас не было "соблазна" засунуть в них типы относящиеся к GUI.

Цитата Сообщение от Ihave Посмотреть сообщение
Так вроде ваша вторая фиксация работает на отлично, тестирую...
Вроде, они обе работали.
Проверял по брекпоинтам.
Может в первую внёс не корректные изменения из-за того что забыл сделать фиксацию.
Сейчас проверю.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 23:11  [ТС]
Да второй вариант работает на отлично, считаю что его надо использовать, так как будет потом навигации и тд внутри главной панели... но пока это далекая история

У меня несколько вопросов:

C#
1
2
3
                //REM: Здесь нужно будет внедрить сервис
                    //ContentDialog dialoginternet = new NoInternet();
                    //ContentDialogResult result = await dialoginternet.ShowAsync();
Хотелось бы вызывать контент диалоги во VM, на сколько это правильно? И как сделать сервис на них ?

InfoBar - имеет состояние Severity и у него состояния только: Error,Warning,Success,Informational передать их по string не вариант, контрол использовать категорическии нельзя, как можно выкрутиться? Конвертором ?

Если несколько ViewModel, я просто создаю их и делаю похожую привязку как и на SignVM в APP ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 23:17
Ihave, да, там ошибка в App.
Вместо поля присваиваю значение локальной переменной и оно теряется.
Нужно убрать тип, оставить только имя поля:
C#
81
            /* SignVM */ signViewModel = new SignVM(signModel);
Во втором варианте тоже нужно сделать так же.

Цитата Сообщение от Ihave Посмотреть сообщение
Даа такая же 10, только в новой обертке
Я имею ввиду, как по нагрузке на комп?
Старый комп потянет?

Добавлено через 5 минут
Цитата Сообщение от Ihave Посмотреть сообщение
Такс понизил сборку до Windows 10. Обновил реп 3e1ffe3 и закомментировал лишние.
Вообще, советую продакшен делать с минимально возможной версией.
Ведь повышая версию, вы отрезаете множество потенциальных покупателей.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 23:19  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я имею ввиду, как по нагрузке на комп?
Старый комп потянет?
Да я понял, я это и имел ввиду, что по нагрузки так же. Возможно чуть больше за счет виджетов и "новых функций", но если это скрыть, то будет все ок, места вроде только чуть больше занимает, а так разницы не заметил вообще. Но у меня очень свежий комьпьютер, поэтому мой отзыв не совсем корректный...

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ihave, да, там ошибка в App.
Вместо поля присваиваю значение локальной переменной и оно теряется.
Нужно убрать тип, оставить только имя поля:
Ок проверю, вы как считаете, какой более лучше ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 23:20
Ihave, ставили на лицензию?
Нужна новая или от десятки подходит?
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 23:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вообще, советую продакшен делать с минимально возможной версией.
Ведь повышая версию, вы отрезаете множество потенциальных покупателей.
Я так и делаю, у меня минимальная версия стоит от 1809, НО СТОЯЛА целевая версия Windows 11!

Добавлено через 25 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ставили на лицензию?
Нужна новая или от десятки подходит?
ОТ 10ка зашла, причем я ставил чистую с флешки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 23:24
Цитата Сообщение от Ihave Посмотреть сообщение
Ок проверю, вы как считаете, какой более лучше ?
Чёрт его знает.
А не юзаю UWP.
Надо поинтересоваться у тех кто его активно использует.
Позову limeniye.
Сами посмотрите темы в Разделе, кто отвечает на вопросы по UWP и позовите их сюда.

Добавлено через 1 минуту
Цитата Сообщение от Ihave Посмотреть сообщение
НО СТОЯЛА целевая версия Windows 11!
A... Это мне нужно было пакет нацеливания в Студии изменить.
Но пакет нацеливания, вроде, ставится тоже не выше ОС.
Проверю - отпишу ещё.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 23:34  [ТС]
Цитата Сообщение от Ihave Посмотреть сообщение
InfoBar - имеет состояние Severity и у него состояния только: Error,Warning,Success,Informational передать их по string не вариант, контрол использовать категорическии нельзя, как можно выкрутиться? Конвертором ?
Сам отвечаю на вопрос, по идее конструкция такая должна работать:

C#
1
2
3
4
5
6
7
8
9
10
        private InfoBarSeverity _infoBarSev;
        public InfoBarSeverity InfoBarSev { get => _infoBarSev; set => Set(ref _infoBarSev, value); }
 
        public enum InfoBarSeverity
        {
            Warning,
            Information,
            Success,
            Error
        }
Но нужен граммотный конвертор, так как ошибка
Cannot directly bind type 'ViewModel.SignVM+InfoBarSeverity' to 'Microsoft.UI.Xaml.Controls.InfoBarSever ity'. Use a cast, converter or function binding to change the type

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
A... Это мне нужно было пакет нацеливания в Студии изменить.
Но пакет нацеливания, вроде, ставится тоже не выше ОС.
Проверю - отпишу ещё.
Ну по идее да, но я уже понизил в ветке Main если что...

Элд Хасп, ответьте пожалуйста на вопросы еще Post: 84

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Позову limeniye.
Сами посмотрите темы в Разделе, кто отвечает на вопросы по UWP и позовите их сюда.
Хорошо, я гляну конечно, но надо протестировать будет два варианта, а то пока одна страница, они оба хороши Я завтра обновлю программу и добавлю еще одну страницу, я простестирую все и если будут проблемы отпишу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 23:53
Цитата Сообщение от Ihave Посмотреть сообщение
Хотелось бы вызывать контент диалоги во VM, на сколько это правильно? И как сделать сервис на них ?
Диалог это делегат метода.
Передаётся он в VM.
Что за метод будет выполняться по делегату VM неизвестно.
Она просто вызывает исполняет делегат, если он не нулевой.
Если делегатов много, то их записывают (обычно методом регистрации) в сервис и уже сервис передают VM.
Интерфейс такого сервиса объявляется на уровне VM.

Добавлено через 4 минуты
Цитата Сообщение от Ihave Посмотреть сообщение
Если несколько ViewModel, я просто создаю их и делаю похожую привязку как и на SignVM в APP ?
Да.
Кроме предложенных двух способов есть ещё такой: если VM-ей известное количество, можно в ресурсах App объявить локатор в свойствах которого будут все VM.
И страницы привязывать к свойствам локатора.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
16.02.2022, 00:21
Ihave, ещё хотел обратить внимание на кнопку.
Вы привязываете к ней кликер и отдельно свойство IsEnabled.
Так делать не нужно.
Используйте для этого команды.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
16.02.2022, 02:32
Цитата Сообщение от Ihave Посмотреть сообщение
InfoBar - имеет состояние Severity
C#
29
30
31
        //RES: Как мне задать параметр по умолчанию ? Чтобы панель была скрыта = false;?
        private bool _enabledoption;
        public bool Enabledoption { get => _enabledoption; set => Set(ref _enabledoption, value); }
Когда вы обдумаете вопрос какое свойство добавить в VM? в первую очередь вы должны думать о том, что от Модели будет в него отражаться?
Вам нужно выдвинуть-задвинуть Панель.
Как эти действия связанны с состоянием Модели?
Ни как.
Значит и такого свойства в VM быть не должно.

Решить это можно многими способами.
Даже если вам нужна привязка элементам на странице, то добавьте странице ещё одно свойство для Навигатора.
И так как Навигатор это часть View, то вы можете без нарушения MVVM привязываться к этому свойству.
Второй типовой для WPF способ это создание Навигатора в ресурсах App.

Детально не могу показать поскольку не понимаю как эти ваши панели Навигации будут связанны со страницей.
Они будут ТОЛЬКО на этой странице?
Обычно это бывает общий элемент Окна, и реализуется он в Окне, а не на странице.
Посмотрите различные типы макетов Окон: Основы проектирования навигации для приложений для Windows.

Добавлено через 50 минут
Цитата Сообщение от Ihave Посмотреть сообщение
C#
121
        //REM: Тут наши главные три метода, их нужно как то оптимизировать.
Я не знаю вашего API, поэтому просто направление в котором следует идти:
C#
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
        //ANS: Попытка.
        private enum PlusUri
        {
            Auth, UserAuth, NewsShow
        }
 
        private HttpWebResponse GetResponse(PlusUri plusUri, byte[] data = null)
        {
            string uri;
            switch (plusUri)
            {
                case PlusUri.Auth:
                    uri = settings.UriAPI + "/auth";
                    break;
                case PlusUri.UserAuth:
                    uri = settings.UriAPI + "/user/auth";
                    break;
                case PlusUri.NewsShow:
                    uri = settings.UriAPI + "/news/show";
                    break;
                default:
                    throw new ArgumentException("Для этого значения не реализовано", nameof(plusUri));
            }
 
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(uri));
                request.Method = "POST";
                request.Headers.Add("CLIENTKEY", settings.Key);
 
                switch (plusUri)
                {
                    case PlusUri.UserAuth:
                        request.ContentType = "application/json";
                        request.ContentLength = data.Length;
                        using (Stream stream = request.GetRequestStream())
                        {
                            stream.Write(data, 0, data.Length);
                        }
                        break;
                    case PlusUri.Auth:
                    case PlusUri.NewsShow:
                        request.Headers.Add("AUTHTOKEN", settings.Token);
                        request.Headers.Add("hwid", settings.Hwid);
                        request.Headers.Add("device", settings.Device);
                        break;
                    default:
                        throw new ArgumentException("Для этого значения не реализовано", nameof(plusUri));
                }
 
                return (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
 
                return (HttpWebResponse)ex.Response;
            }
        }
 
 
        /// <summary>
        /// Получение токена
        /// </summary>
        private (string json, HttpStatusCode StatusCode) Connect(byte[] data)
        {
            HttpWebResponse response = GetResponse(PlusUri.Auth, data);
 
            if (response != null)
            {
                string responseString = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
                return (responseString, response.StatusCode);
            }
 
            else
            {
                /// Нету подключения к интернету
                return (null, response.StatusCode);
            }
        }
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
19.02.2022, 16:36  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если делегатов много, то их записывают (обычно методом регистрации) в сервис и уже сервис передают VM.
Интерфейс такого сервиса объявляется на уровне VM.
Можете показать как ?
У меня как раз вопрос:
C#
1
 //RES: Это пример сервиса по вызову диалогового окна, но не понимаю, как его связать если самое диалоговое окно находится во View, передачей ? Вызов диалоговых окон может быть несколько и их нужно вызывать в разных местах ViewModel
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Когда вы обдумаете вопрос какое свойство добавить в VM? в первую очередь вы должны думать о том, что от Модели будет в него отражаться?
Никак не связаны, вы правы, но как мне реагировать на действия пользователя ? Мне нужно показывать поле с смс только тогда когда пройдет авторизация. Тоже самое блокировать кнопку и поля пока не получены данные или не ввели смс

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Используйте для этого команды.
Я сделал команду, однако все равно мне необходима Enabledoption, так как она используется и для TextBlock и тд

Вот к этому вопрос сразу:

C#
1
2
3
        //RES: Я сделал пример команды, но все равно приходится использовать Enabledoption, так как при обработке метода MyExecute, нужно блокировать и TextBlock, после этого показывать другую панель. 
        //Но вы так же указываете, все что в ViewModel должно отображатся в модели, как реализовать тот же InfoBar или Visibility, когда реагирую на ответы от модели....
        //Так же пришлось разбить комманды на две части в зависимости от кнопки....
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я не знаю вашего API, поэтому просто направление в котором следует идти:
Хорошо, но там слишком много будет PlusUri, поэтому это выглядит бессмысленно... Но я понял, подумаю что можно сделать. Пока оставлю как есть.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Они будут ТОЛЬКО на этой странице?
Нет, там есть главная страница навигации она будет в MainPage, пока еще не реализовал, но Sing это отдельная страница, нужно чтобы после получение токена она открывала MainPage... И уже MainPage будет главной по навигации.

Отсюда вопрос:

C#
1
 //RES: Как отсюда перевести на MainPage?


Обновил реп 09e72cc
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
19.02.2022, 18:11
Ihave, пока отвечу на часть вопросов.

Цитата Сообщение от Ihave Посмотреть сообщение
Никак не связаны, вы правы, но как мне реагировать на действия пользователя ? Мне нужно показывать поле с смс только тогда когда пройдет авторизация. Тоже самое блокировать кнопку и поля пока не получены данные или не ввели смс
Не верно мыслите.
Если авторизация потребует ввода кода из SMS, то изменится состояние модели.
Это состояние Модели отразится в ViewModel (один из вариантов) как вызов диалога получения кода.
А будет по этому диалогу показана форма для пользовательского ввода, или диалог сам считает смс - это для VM "по барабану".

Цитата Сообщение от Ihave Посмотреть сообщение
Я сделал команду, однако все равно мне необходима Enabledoption, так как она используется и для TextBlock и тд
Опять проникновение логики View в VM - так не должно быть.

Цитата Сообщение от Ihave Посмотреть сообщение
Хорошо, но там слишком много будет PlusUri, поэтому это выглядит бессмысленно...
Ну,.....
Насколько я знаю, - это в любом случае не произвольные строки.
А раз так, то должен быть их список и для формирования запроса надо обращаться к нему, а не вводить его "руками".
Если не нравиться enum - значит нужно придумать что-то иное.
Но концепция должна быть такая же.

Добавлено через 3 минуты
Цитата Сообщение от Ihave Посмотреть сообщение
Можете показать как ?
У меня как раз вопрос:
В самом просто случае:
C#
1
2
3
4
5
public interface IDialogsServis
{
    int CodeSms();
    void MessageShow(string message);
}
Интерфейc объявлен в VM, но реализует его App или View и они же его внедряют в VM.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
19.02.2022, 19:46  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Опять проникновение логики View в VM - так не должно быть.
Как мне тогда выключать к примеру textblock ?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но концепция должна быть такая же.
Ок

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если авторизация потребует ввода кода из SMS, то изменится состояние модели.
Это состояние Модели отразится в ViewModel (один из вариантов) как вызов диалога получения кода.
А будет по этому диалогу показана форма для пользовательского ввода, или диалог сам считает смс - это для VM "по барабану".
Да в этом и прикол, что запрос один, просто идет проверка, если в поле для смс ничего нету, но пришел ответ, что смс отправлена, появляется просто панель с смс и кнопкой или Infobar с ошибкой. Допустим я могу привезать bool GetVisibilitysmstextblock на ответ от модели ( bool isAuthorizated), что ответ пришел положительный, но сам StackPanel с GetVisibilitysmstextblock останется, так как ответ то все равно привязан с View через GetVisibilitysmstextblock. Может просто я запутался, но это выглядит как привязаное к ответу от модели в VM и должно попадать под рамки MVVM
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
19.02.2022, 19:49
Цитата Сообщение от Ihave Посмотреть сообщение
Да в этом и прикол, что запрос один, просто идет проверка ....
Да разницы нет как.
Ваша VM должна работать как служба.
Никакого знания о GUI, даже о консоли у неё нет.
Она отражает Модель в своих свойствах - это весь её функционал от а до я.
Вы можете делать КАК УГОДНО, но тогда это не будет MVVM.
Вы же хотите построить приложение в правильной реализации MVVM.

Уже в тридесятый раз вам пишу, ЗАБУДЬТЕ ПРО GUI!
Считайте что у вас его нет.
И постройте сначала Модель, которая пройдёт ВСЕ ТЕСТЫ.
Пока вы этого не сделаете, то так и будете блуждать в трёх соснах.

Всё что вас должно интересовать на этом этапе - это как создать экземпляр Модели в App.
Пока вы это не сделаете ни о каком WPF даже не думайте.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
19.02.2022, 20:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Уже в тридесятый раз вам пишу, ЗАБУДЬТЕ ПРО GUI!
Считайте что у вас его нет.
И постройте сначала Модель, которая пройдёт ВСЕ ТЕСТЫ.
Пока вы этого не сделаете, то так и будете блуждать в трёх соснах
Мммм я вроде так понял, что перешли уже на View и ViewModel за исключением "космитической переделки" модели.

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
        private HttpWebResponse GetResponse(PlusUri plusUri, byte[] data = null)
        {
            string uri;
            switch (plusUri)
            {
                case PlusUri.Auth:
                    uri = settings.UriAPI + "/auth";
                    break;
                case PlusUri.UserAuth:
                    uri = settings.UriAPI + "/user/auth";
                    break;
                case PlusUri.NewsShow:
                    uri = settings.UriAPI + "/news/show";
                    break;
                default:
                    throw new ArgumentException("Для этого значения не реализовано", nameof(plusUri));
            }
 
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(uri));
                request.Method = "POST";
                request.Headers.Add("CLIENTKEY", settings.Key);
 
                switch (plusUri)
                {
                    case PlusUri.UserAuth:
                        request.ContentType = "application/json";
                        request.ContentLength = data.Length;
                        using (Stream stream = request.GetRequestStream())
                        {
                            stream.Write(data, 0, data.Length);
                        }
                        break;
                    case PlusUri.Auth:
                        request.Headers.Add("AUTHTOKEN", settings.Token);
                        request.Headers.Add("hwid", settings.Hwid);
                        request.Headers.Add("device", settings.Device);
                        break;
                    case PlusUri.NewsShow:
                        request.Headers.Add("AUTHTOKEN", settings.Token);
                        request.Headers.Add("hwid", settings.Hwid);
                        request.Headers.Add("device", settings.Device);
                        request.ContentType = "application/json";
                        request.ContentLength = data.Length;
                        using (Stream stream = request.GetRequestStream())
                        {
                            stream.Write(data, 0, data.Length);
                        }
                        break;
                    default:
                        throw new ArgumentException("Для этого значения не реализовано", nameof(plusUri));
                }
 
                return (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
 
                return (HttpWebResponse)ex.Response;
            }
        }
Вот "финал", переделал case PlusUri.NewsShow: так как там нужен еще запись стрима. Все оттестировал - работает, так же как и было до этого с методами разными. Обновил реп. Посмотрите когда у вас будет время на модель.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
19.02.2022, 20:48
Цитата Сообщение от Ihave Посмотреть сообщение
У меня как раз вопрос:
Цитата Сообщение от Ihave Посмотреть сообщение
C#
52
                // RES: Как можно в другой конструкции ({ get => _enabledoption; set => Set(ref _enabledoption, value); } ) реализовать RaiseCanExecuteChanged
Это называется "создание зависимостей". Для этого в любых нормальных реализациях INPC предусмотрены специальные инструменты.
В моей реализации BaseInpc для этого служит метод OnPropertyChanged, но присваивать значение свойству надо ОБЯЗАТЕЛЬНО через метод Set.
Реализацию я вам поставил неверную - та тестовая какая-то была.
Сейчас поменял на правильную.

Пример использования:
C#
57
58
59
60
61
62
63
64
65
66
67
68
                //MyCommandPhone.RaiseCanExecuteChanged();
                Set(ref _enabledoption, value);
            }
        }
 
        protected override void OnPropertyChanged(in string propertyName, in object oldValue, in object newValue)
        {
            base.OnPropertyChanged(propertyName, oldValue, newValue);
 
            if (propertyName == nameof(Enabledoption))
                MyCommandPhone.RaiseCanExecuteChanged();
        }
Цитата Сообщение от Ihave Посмотреть сообщение
C#
193
194
                            // RES: Как отсюда перевести на MainPage?
                            // Frame.Navigate(typeof(MainPage), new DrillInNavigationTransitionInfo());
Ни как. Если действие UI, то для этого в сервисе есть соответсвующий метод.
VM вызывает этот метод. А что там будет изменено в GUI она не знает и знать не должна.

Добавлено через 6 минут
Цитата Сообщение от Ihave Посмотреть сообщение
что перешли уже на View и ViewModel за исключением "космитической переделки" модели.
Я тоже.
Но у вас появляются вопросы связанные с состоянием Модели (показ скрытие UI элементов).
А в Модели нет соответствующих состояний.
Из-за этого приходится возвращаться опять к Модели.

То есть вы ни как не привыкните мыслить от Данных.
Вы мыслите "Вот мне пользователю надо показать это (что-то там), для этого нужно в VM мне нужно добавить свойство управляющее UI элементом".

А должны мыслить так "Для пользователя нужно показать "это", "это" соответствует такому-то состоянию Модели, для этого надо в Модели реализовать тото и тото, потом это отразить в такое-то свойство VM".

Добавлено через 4 минуты
Такой из офлайна пример.
Вы строите дом вам потребовался камень - уровень GUI.
Вы ищите его и заказываете - уровень Модели.
После этого его к вам привозит транспортная компания - уровень VM.

Какая бы ни была транспортная компания (VM) она не может привести материала которого нет у производителей (Модель).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
19.02.2022, 20:50
Цитата Сообщение от Ihave Посмотреть сообщение
. Обновил реп. Посмотрите когда у вас будет время на модель.
Я тоже обновил ответами на вопросы.
Посмотрите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2022, 20:50

Разбор JSON, используя Newtonsoft.Json
Добрый день! Подскажите пожалуйста, как десериализовать JSON-ответ следующего вида {&quot;result&quot;: ...

Моделирование работы РЛС с использованием объектно-ориентированного подхода
Товарищи,появился вопрос.Написал программу которая моделирует работу РЛС с декартовой системе координат с двумя координатами х и у.Но...

Использованием навигационного подхода без применения SQL запросов
Разработать клиентское приложение, которое должно содержать несколько вкладок. Каждая из вкладок предназначена для представления...

Моделирование работы РЛС с использованием объектно-ориентированного подхода
Задание: Требуется создать программу (консольное приложение), реализованную с помощью классов и предназначенную для моделирования процесса...

Парсинг json ответа api vk. Вложенность Json
Ответ в json response: { count: 6641, items: , post_source: { type: 'vk' }, comments: { count: 24,


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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