|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||||||||||||||||
UWP Разбор MVVM подхода с использованием API и Json04.02.2022, 21:07. Показов 9475. Ответов 126
Доброго времени суток,
Как уже писал, перехожу на подход MVVM и сталкиваюсь с проблемами, шерстил форум, но не нашел подходящие решение для моего случая. Очень буду благодарен за помощь. Логика следующая, пользователей вводит номер телефона, по апи идет запрос и я получаю ответ в виде JSON, и если JSON приходит в response, то панель с смс должна появится. Если номер не правильный то приходит в error значение. Проблема вот в чем. Как мне вернуть данные из Model в ViewModel, не используя статический класс или свойство ? Да в принципе, как правильно управлять данными которые пришли в model и передать их в Viewmodel на примере JSON. View:
Так же я понимаю, что возможно здесь ошибки подхода MVVM, любые поправки с теплотой приму
0
|
|||||||||||||||||||||
| 04.02.2022, 21:07 | |
|
Ответы с готовыми решениями:
126
Создание программ с использованием структурного подхода Напишите программу (с использованием ООП подхода) |
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||
| 19.02.2022, 20:54 [ТС] | |||||||
0
|
|||||||
|
Модератор
|
||
| 19.02.2022, 20:55 | ||
|
Посмотрел
Уже что-то похожее на правду. НО!!! Теперь выясняется, что у вас есть состояние занятости - если я правильно понял. Тогда нужно добавить его индикацию, взвод, сброс. Добавлено через 1 минуту Конвертер конвертирует одно значение в другое. Что во что он должен конвертировать?
0
|
||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||
| 19.02.2022, 21:04 [ТС] | |||
|
StatusCode - 200 в состояние Success, которое поймет V. Так как 200 для InfoBar ничего не значит. Я уже подумал, что можно в модели еще один возврат bool сделать на этот случай тогда, если нельзя в VM лишних свойств.
0
|
|||
|
Модератор
|
|||
| 19.02.2022, 23:30 | |||
|
В текущей реализации HttpStatusCode получает только метод MyExecute. Пусть при получении проверяет его значение и устанавливает свойство InfoBarSev. Или есть какие-то иные ограничения? Я откуда знаю что это за Textblock? И как понять "заблокированный TextBlock"? Невидимый что ли? Вы объясните действия логические, на человеческом языке. Вводится логин, нажимается кнопка вход, отправляется запрос, приходить ответ .... ну. и т.д, Я понимаю из ваших объяснений, что это какой-то протокол двойной авторизации через sms, но деталей понять не могу. Напишу как понял: 1) Ввод логина; 2) Клик аторизации; 3) блокировка поля ввода логина от изменений и запрос с указанным логином; 4) Может прийти два типа ответов; 5) Первый тип: Всё Ок - авторизация успешна; 6) Второй тип: нужен код из смс; 7) Показывается доп. поле для ввода кода; 8) После ввода - повторная авторизация с тем же логином и кодом.
0
|
|||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||
| 20.02.2022, 00:11 [ТС] | |||
|
Но нужен грамотный конвертор, так как ошибка 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 1) Поле с вводом номера телефона; 2) Кнопка "войти" со свойством клика авторизации; 3) Блокировка поля с номером телефона и кнопки войти - запрос (клик авторизации) с указанным номером телефоном 5) Может прийти два типа ответов; a) Ответ 200: - показывается доп поле для ввода кода смс. Поле с номером телефона и кнопкой авторизацией остаются заблокированы. Появлятеся infobar с Success b) Другие ответы не 200: появляется infobar с ошибкой. Разблокируется поле номера телефона и кнопки войти 6) Ввод кода смс - запрос (клик авторизации) с указанным номером телефона и кодом смс ! 7) Может прийти два типа ответов: a) Ответ 200: - получаем токен. идет запрос чек токен, а после запроса уже открывается страница MainPage и тд.... b) Другие ответы не 200: появляется infobar с ошибкой. Блокированый - IsEnabled="false"
0
|
|||
|
Модератор
|
||||||||
| 20.02.2022, 09:26 | ||||||||
|
У писал уже не раз (не помню вам тоже или нет) в современном Шарпе не используются вложенные публичные типы. А WPF с ними, вообще, плохо работает. У думал вы просто для примера показали перечисление InfoBarSeverity внутри VM. Вынесите его в пространство имён и в отдельный файл. Добавлено через 3 минуты И второе. Я не пойму для чего вам это перечисление. Вам нужно перечисление Microsoft.UI.Xaml.Controls.InfoBarSeveri ty или ваше собственное? Может вы собственное привели для примера, а нужно вам преобразовывать HttpStatusCode в Microsoft.UI.Xaml.Controls.InfoBarSeveri ty? Добавлено через 23 минуты Ihave, если правильно понял, то вот такой конвертер:
Добавлено через 11 минут Если да, то: 1) Модель будет иметь состояния: не авторизирована, авторизация начата, треба код смс для продолжения авторизации, авторизация успешно завершена, ошибка авторизации. Надо эти состояния раскидать по одному-двум свойствам; 2) У Модели должен быть флаг занятости: приняла запрос - подняла флаг; обработала запрос и перед его возвратом - сбросила флаг. Это тоже отдельное свойство; 3) Идентификатор текущего акка (номер телефона) - отдельное свойство; 4) Эти состояния должны отражаться в свойства VM; 5) Для уведомления об изменении состояния Модель должна подымать событие (или события). Пока для упрощения можно для этого использовать реализацию INPC.
0
|
||||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||||||||||
| 20.02.2022, 15:01 [ТС] | ||||||||||
|
Поэтому вот что я придумал, а вы поправьте если это не верно. 1) Я дополнительно на первый запрос только с номером телефона будут возвращать bool из модели в VM, который и будет отвечать за блокировку поля с номером телефона. Добавлено через 20 минут
0
|
||||||||||
|
Модератор
|
|||||||||||||
| 20.02.2022, 18:02 | |||||||||||||
|
Не было времени. Только освободился. Делал как в WPF. Может в UWP есть свои нюансы. ОН будет конвертировать и из совместимых типов. Сейчас посмотрю что с ним не так. Добавлено через 1 час 6 минут Ihave, проверил - здесь немного по иному работает конвертер и ещё x:Bind тоже имеет свои нюансы. Вот отлаженный вариант:
Добавлено через 1 минуту Очень странно работают в UWP конвертеры. Я же проверяю сначала валидность значения методом IsValid(...) и тем не менее он потом выкидывает исключение. Добавлено через 53 секунды Проверял конвертацию из перечисления и из строки:
0
|
|||||||||||||
|
Модератор
|
||
| 20.02.2022, 18:09 | ||
|
Это разные состояния Модели: первичная авторизация и авторизация с кодом. Соответственно в Модели нужно как-то показать в каком она состоянии. Это принципы ООП. Каждый метод делает только одну функцию. Что-то в таком духе должно быть: Вы смотрите состояние Модели - она готова к авторизации. Послали запрос на авторизацию - ей состояние изменилось на "авторизация начата - требуется код". Послали второй запрос на авторизацию - состояние изменилось "авторизация успешна" или "в авторизации отказано".
0
|
||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||||||||||
| 20.02.2022, 18:35 [ТС] | ||||||||||
|
Еще вопрос по поводу "красоты" Это пример:
Ввел номер телефона жмешь Enter вызывается клик или команда и SetPhone оказывается пустым, возвращается ошибка, что SetPhone пустой Получается следующие: Если ввести номер и убрать фокус с бокса номера телефона, а потом снова перевести фокус на ввод номера телефона и нажать Enter, то в поле SetPhone были сохранены данные. Как можно сохранять данные в SetPhone в процессе ввода данных ? PS Обновил реп 8852723
0
|
||||||||||
|
Модератор
|
|||
| 20.02.2022, 18:47 | |||
|
Зафиксируйте вариант использования при котором выдаёт исключение. Добавлено через 1 минуту Теперь вам захотелось авторизоваться с номера 999999. Ваше приложение должно ОДНОВРЕМЕННО работать с двумя номерами. Или для авторизации по 999999 надо выйти из 111111 ?
0
|
|||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||
| 20.02.2022, 18:51 [ТС] | |||
|
0
|
|||
|
Модератор
|
|||
| 20.02.2022, 19:14 | |||
|
x:Bind не принимает DependencyProperty.UnSet. А у вас там некорректное значение поступает вначале. Фиксацю отправил. Добавлено через 1 минуту Логин - это часть состояния Модели. Самое простое, после начала авторизации, его зафиксировать в свойстве Модели. Вы ни как не можете мыслить без UI. Все ваши идеи, предложения начинаются с UI и заканчиваются на нём. UI - это третьестепенная часть Приложения. А VM, вообще, где-то на 10 уровне.
1
|
|||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||
| 20.02.2022, 19:15 [ТС] | |||
|
Хорошо, сейчас проверю
0
|
|||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|
| 20.02.2022, 19:22 [ТС] | |
|
0
|
|
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
||
| 20.02.2022, 19:38 [ТС] | ||
|
Так же я пишу от UI, чтобы просто обьяснить суть. Я понимаю, что нужно исходить от модели и VM должно быть только отражение модели, некоторые вещи просто делаю, так как могу, в силу не знаний MVVM. Отсюда и проблемы. Что значит зафиксировать в свойстве модели ? Зачем? для чего ? Чтобы что потом с ним делать ? Если будет у вас время, покажите, как должно это выглядить на реальном примере. А то я так не понимаю, что вы имеете ввиду и соотвественно, что я должен сделать.
0
|
||
|
Модератор
|
||||||||
| 20.02.2022, 19:56 | ||||||||
|
Поэтому только логика без деталей.
К ней может быть подключена одна VM, может 100 VM, а может ни одной. И каждая VM отражает состояние Модели. А если вы будет это состояние хранить только в VM (по возвращённому методом значению), то другая VM не будет знать об этом и ,соответственно, не сможет правильно отразить состояние Модели. Представьте, что на каждое действие вы создаёте новую VM. Как вторая VM узнает, что авторизация уже начата другой VM и сейчас надо отправить код? Добавлено через 3 минуты Ведь по сути View с вводом логина, и View в котором логин уже есть и вводится код - это две РАЗНЫЕ View. Вы просто их совместили в одном XAML. Так же у каждой из них своя VM, которые вы тоже совместили в одной. А VM НЕ ДОЛЖНЫ ХРАНИТЬ ДАННЫЕ. Если бы вы их раздели функционально, то вам самому это стало бы очевидно.
0
|
||||||||
|
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
|
|||||||||||||
| 20.02.2022, 20:08 [ТС] | |||||||||||||
|
Ещё раз в модели у нас вот такой метод:
На другие отражение VM, я буду создавать новые методы в Модели по типу той, что наверху. Как например. Я создал:
Это правильная логика MVVM ? Или вы имеете ввиду, что здесь ошибка ? Добавлено через 4 минуты VM не должна хранить данные ? Это как понимать ? Она по сути хранит, то что в нее ввели? Или нет ? Данные потом все равно надо совмещать в один, при разделение их, надо в финале передавать так же логин и код, если вы разделите логику, нужно будет все равно логин передавать, так как второй запрос требует одновременно и логина и кода. А при первом только логиню.
0
|
|||||||||||||
| 20.02.2022, 20:08 | |
|
Разбор JSON, используя Newtonsoft.Json Моделирование работы РЛС с использованием объектно-ориентированного подхода Использованием навигационного подхода без применения SQL запросов Моделирование работы РЛС с использованием объектно-ориентированного подхода Парсинг json ответа api vk. Вложенность Json Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|