Форум программистов, компьютерный форум, киберфорум
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. Показов 9497. Ответов 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
12.02.2022, 11:55
Студворк — интернет-сервис помощи студентам
Ihave, в связи с вышесказанным, просматриваю ваш репозиторий только в браузере.
Из-за этого могу многое что упустить или неверно понять.

Пока такие мои замечания:
1) [JsonPropertyName("response")] в VM.
Для чего служит этот атрибут? Он нужен для правильной работы с Хранилищем. А работой с Хранилищем занимается нижний уровень Модели.
В VM никоим образом не должно быть такого типа атрибутов;

2) SignVM : INotifyPropertyChanged - вы же в ООП работаете!
Создайте базовый класс и наследуйте от него.
Собственно непосредственно к вашей VM реализация INPC не имеет никакого отношения. Главное чтобы она была, а детали её реализации неинтересны.
Следовательно это функция Базового Класса.
Возьмите базовый отсюда: Простые реализации для тем на форуме;

3) В Модели SignVM postData = new SignVM - серьёзно?
О каком MMVM тогда можно вести речь?
В MVVM очень строга иерархия: View "знает" ТОЛЬКО о VM, VM - только о Модели, а Модель самодостаточна она не должна никоим образом иметь сведения ни VM, ни о View. Не то что об их экземплярах, даже об их типе;

4) public (bool isAuthorizated, int error, HttpStatusCode StatusHttp) Authorizat - уже сколько раз вам писал, что не должна Модель возвращать данные специфичные для хранилища?
Я вам убираю из публичных методов HttpStatusCode и byte[], а вы опять его пихаете туда!
Ваша цель: написать "правильный MVVM" или чтобы не надоело вас исправлять?
Нет ни одной причины, ни в какой задаче, ни в какой теоретически возможной ситуации, по которой HttpStatusCode (и другие специфичные для Хранилища типы) могут появиться в VM.
Хранилищем (более правильно Источником Данных) занимается самый нижний слой Модели - Репозиторий.
И даже в самой Модели, кроме как в Репозитории их больше нигде быть не должно.
Просто у вас нет никакой Бизнес Логики и в вашей Модели ничего кроме Репозитория нет, поэтому эти типы свободно гуляют по всей Модели.
Но из Модели им шагу никуда сделать нельзя!
И это касается не только MVVM. Это относится к любому паттерну в котором выделена Модель: MVC, MVP и любой другой какой смогут придумать.

Добавлено через 7 минут
В самом простом случае, расшифровывайте HttpStatusCode в стринг с описанием ошибки.
В более продвинутом варианте, можно сделать свой тип для ошибок, чтобы через App текст описания был локализован.

Добавлено через 4 минуты
Ihave, да - ещё раз пишу.
Речь идёт о ПРАВИЛЬНОМ MVVM.
На практике часто отходят от идеала.

Допустим, в вашем случае, вам не нужна абстракция от Хранилища, поскольку вы строите, по сути, GUI для работы с WEB сервером.
Но в правильном ОПП нужно обязательно АБСТРАГИРОВАТЬСЯ от Хранилища.
О типе Хранилища могут знать только Модель (если в ней нет выделенного Репозитория) и App.

Добавлено через 4 минуты
На практике, для вашего приложения, 4 пункт можно "срезать" - можно возвращать HttpStatusCode и выводить по нему заранее заготовленной сообщение.
Но в ИДЕАЛЬНОМ MVVM (MVC, MVP) такого быть не должно.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 17:44  [ТС]
Элд Хасп, Хочу сразу поблагодарить вас ещё раз за помощь и за то что "няньчитесь" со мной.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для чего служит этот атрибут? Он нужен для правильной работы с Хранилищем. А работой с Хранилищем занимается нижний уровень Модели.
В VM никоим образом не должно быть такого типа атрибутов;
Этот атрибут нужен для сериализации и десериализации JSON, чтобы он понимал куда именно пихнуть JSON который пришел или собрал с нужными значениями из необходимов элементов. Я же не могу это в модель запихнуть ?!

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Создайте базовый класс и наследуйте от него.
Сделано.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
3) В Модели SignVM postData = new SignVM - серьёзно?
Вот тут у меня и был вопрос, должен ли я это в модели держать или передавать это, выше в посте вы уже ответили, что я могу передавать так:
C#
1
public (bool isAuthorizated, int error, HttpStatusCode StatusHttp) Authorizat(SignVM postData)
Но разве снова не получается, что модель будет "знать о VM"....

Цитата Сообщение от Элд Хасп Посмотреть сообщение
На практике, для вашего приложения, 4 пункт можно "срезать" - можно возвращать HttpStatusCode и выводить по нему заранее заготовленной сообщение.
Но в ИДЕАЛЬНОМ MVVM (MVC, MVP) такого быть не должно.
Хорошо, лучше тогда давайте сделаем идеальный, а там уже людям видно будет. Я поменяю на int, так как важнее именно код получить, а не значение кода.


Так же у меня к вам вопрос, в APP у меня

C#
1
2
3
4
5
                        Settings["Key"] = "KEY";
                        Settings["UriAPI"] = "https://api.WEBSITE.ru";
                        Settings["Hwid"] = UNID;
                        Settings["Device"] = AnalyticsInfo.VersionInfo.DeviceFamily;
                        localSettings.Values["Settings"] = Settings;
как мне передать эти значения в модель из APP Правильно... Чтобы избавиться от localSettings.

Я могу некоторые параметры сразу установить так в Модели. Но изменяемые данные типо Hwid, собираются. И как мне передать их из APP когда там пройдет процедура сбора данных.

C#
1
2
/// Пример
        private string Device{ get; } = AnalyticsInfo.VersionInfo.DeviceFamily;
Добавлено через 12 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам нужно:
Сделано. Обновил реп с учтом всех ваших замечаний и поправок.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 18:14
Цитата Сообщение от Ihave Посмотреть сообщение
Я же не могу это в модель запихнуть ?!
Не только можете, но и должны так сделать.
Для этого на уровне Модели создайте отдельный класс для сериализации JSON.
VM это ни каким боком не касается.

Цитата Сообщение от Ihave Посмотреть сообщение
Но разве снова не получается, что модель будет "знать о VM"....
Получается, поэтому я вам несколько раз показывал, что это метод в параметрах должен принимать не VM, а логин и пароль.

Добавлено через 56 секунд
Цитата Сообщение от Ihave Посмотреть сообщение
Сделано. Обновил реп с учтом всех ваших замечаний и поправок.
Сейчас посмотрю как у меня клонироваться будет.

Добавлено через 5 минут
Ihave, папка .vs осталась в репозитории.
Не заходя в Студию, в браузере удалите её.
И скиньте мне приглашение на EldHasp. Аватарка такая же как здесь на Форуме.

Добавлено через 3 минуты
Цитата Сообщение от Ihave Посмотреть сообщение
Хорошо, лучше тогда давайте сделаем идеальный
Для того чтобы вам было понятнее:
1) Добавьте в Решение Новый Проект "Model" типа "Библиотека классов";
2) В этом проекте не должно быть никаких ссылок на другие проекты в этом Решении;
3) Перенесите ваш класс SignM в это проект;
4) И после этого завершите реализацию этой Модели.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 18:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Получается, поэтому я вам несколько раз показывал, что это метод в параметрах должен принимать не VM, а логин и пароль.
да я помню, но я так же сказал, а если будет не два параметра а 10 ? И как мне потом сериализировать? Исходя из ответа выше, я создам класс на уровне модели.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
папка .vs осталась в репозитории.
Не заходя в Студию, в браузере удалите её.
И скиньте мне приглашение на EldHasp. Аватарка такая же как здесь на Форуме.
Приглашение кинул и удалил .vs
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 18:24
Цитата Сообщение от Ihave Посмотреть сообщение
Приглашение кинул и удалил .vs
Вроде сейчас всё ок.
Клонируется, собирается нормально, лишних файлов не появляется.

Я сейчас вам слегка подравняю структуру Репозитория.
А потом вы продолжите.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 18:29  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я сейчас вам слегка подравняю структуру Репозитория.
А потом вы продолжите.
Супер, я уже создал новый проект и доделываю то что вы сказали, пока заливать не буду, посмотрю ваши изменения и потом все вместе исправлю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 18:34
Ihave, я только обратил внимание.
У вас проект UWP.
Чем это вызвано?
Вы собираетесь для OneBox писать?

Добавлено через 46 секунд
Цитата Сообщение от Ihave Посмотреть сообщение
Супер, я уже создал новый проект и доделываю то что вы сказали, пока заливать не буду, посмотрю ваши изменения и потом все вместе исправлю.
Если сделали - заливайте.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 18:38  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У вас проект UWP.
Чем это вызвано?
Вы собираетесь для OneBox писать?
Я выбрал как самое преспективное, если майки еще, что то добавят помимо Бокса телеков и прочее.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если сделали - заливайте.
Мне осталось пару штрихов, через 5 минут залью.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 18:44
Цитата Сообщение от Ihave Посмотреть сообщение
Я выбрал как самое преспективное,
Чаво...?
Он на грани того, что его через год-два официально похоронить могут.
На Desktop не выдерживает конкуренцию с WPF Core.
Перспективы для многоплатформенности у Core тоже лучше.
В настоящее время на этом поприще его значительно обходят Xamarin, Avalonia и т.п.
В этих пакетах или уже есть поддержка WPF Core, или продекларировано, что будет в ближайшее время.

Фактически он живой только из-за магазина MS в котором только UWP приложения разрешены.

В UWP есть ОЧЕНЬ много своих косяков, которые резко усложняют реализацию в сравнении с WPF.

Добавлено через 36 секунд
Цитата Сообщение от Ihave Посмотреть сообщение
Мне осталось пару штрихов, через 5 минут залью.
Я сейчас отвлекусь на полчаса-час - потом посмотрю и продолжу.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 18:59  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я сейчас отвлекусь на полчаса-час - потом посмотрю и продолжу.
Пришлось создать новый репозиторий, чтобы не копаться как старый обновить с новым проектом.

https://github.com/Odaronil/MVVM.git

Я отправил вам так же приглашение.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Фактически он живой только из-за магазина MS в котором только UWP приложения разрешены.

Программа опубликована в магазине уже, поэтому тут уже выбрать другое не получается и еще сразу компиляция на ARM и тд, не знаю есть ли это так же в WPF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 19:16
Цитата Сообщение от Ihave Посмотреть сообщение
Программа опубликована в магазине уже
Я не о том, чтобы эту менять.
Просто такой выбор должен быть чем-то продиктован.
И UWP стоит выбирать только если есть намерение расширяться на WinRT.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 19:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В UWP есть ОЧЕНЬ много своих косяков, которые резко усложняют реализацию в сравнении с WPF.
Мне казалось скорее не косяки, а ограничение есть, так как UWP это посуть контейнерное приложение.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я не о том, чтобы эту менять.
Просто такой выбор должен быть чем-то продиктован.
Выбор был сделан, "преспективностью" начал делать программу еще 3 года назад опубликованием в магазине и компиляция под процы.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 20:00
Ihave, структуру создал.
Вроде понятно должно быть.
Синхронизируйте и посмотрите.

Цитата Сообщение от Ihave Посмотреть сообщение
Мне казалось скорее не косяки, а ограничение есть, так как UWP это посуть контейнерное приложение.
С моего уровня знакомства с UWP он очень сыро реализован, многих очевидных и обычных для WPF вещей в UWP нет и не предвидится.
Такое ощущение, что начали делать и на полдороге бросили.

Цитата Сообщение от Ihave Посмотреть сообщение
Выбор был сделан, "преспективностью" начал делать программу еще 3 года назад
Ну, тогда понятно.
Три года назад MS ещё активно продвигало UWP, на всех углах трендели, что это приемник WPF.
Хотели стать аналогом Apple с их магазином.
А по факту у них ничего не вышло.
Окончательно сдались в конце 20г.
Тогда выпустил WPF Core (сейчас уже просто WPF), завершили развитие Framework, стали активно развивать Core и WPF.
Об UWP, вообще, после этого перестали говорить.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 20:27  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Синхронизируйте и посмотрите.

Посмотрел, вопросики.

C#
1
// Это Контролл - в VM не может быть на него ссылки
1) А как мне реализовать без контролла ? На каждое свойство создавать свойство в VM ?
2) Вопрос с переносом еще остался пост 42 - как мне передать эти значения в модель из APP Правильно... Чтобы избавиться от localSettings.
3) Если передаваемых данных в модель более двух трех и тд Я создам мутабельный DTO в модели и буду его собирать в VM уже ?
Пример:
VM
C#
1
2
3
4
5
                PostData args = new PostData
                {
                    PostPhone = SetPhone,
                    PostSms = SetSms,
                };
M
C#
1
        public (bool isAuthorizated, string error, int StatusHttp) Authorizat(PostData args)
4) Могу я вызывать ContentDialog из VM ? Или это так же не желательно, и как тогда вызывать его ?

В тысячный раз спасибо за помощь и дополнением еще стандартными классами...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 21:03
Цитата Сообщение от Ihave Посмотреть сообщение
1) А как мне реализовать без контролла ? На каждое свойство создавать свойство в VM ?
Мне пока не вполне понятно что в целом реализуете? поэтому детально сказать не могу.
Но общая концепция такая: ViewModel - это прокси отражающий Модель в своих свойствах.
Больше ничего в VM быть не должно.

Есть у вас контролл в Модели?
Нет и быть его там не может.
Значит и VM не может отразить несуществующий котролл.

Добавлено через 26 секунд
Цитата Сообщение от Ihave Посмотреть сообщение
3) Если передаваемых данных в модель более двух трех и тд Я создам мутабельный DTO в модели и буду его собирать в VM уже ?
Да.

Добавлено через 2 минуты
Цитата Сообщение от Ihave Посмотреть сообщение
2) Вопрос с переносом еще остался пост 42 - как мне передать эти значения в модель из APP Правильно... Чтобы избавиться от localSettings.
Я же писал.
App их может передать или напрямую в Модель, или через VM? если эти данные в VM тоже нужны.

Сейчас пока давайте Модель закончим.
А уже дальше будем думать как и что.

Добавлено через 5 минут
На текущем этапе посмотри саму структур, если что нужно и можешь подправь.
Как зафиксируетесь - посмотрю и продолжим дальше.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 22:04  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
На текущем этапе посмотри саму структур, если что нужно и можешь подправь.
Как зафиксируетесь - посмотрю и продолжим дальше.
Да я посмотрел, все понятно, особенно когда это отдельными проектами сделано

Вопрос: CommonUWP для чего он обычно будет использоваться ?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть у вас контролл в Модели?
Нет и быть его там не может.
Значит и VM не может отразить несуществующий котролл.
понял

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Мне пока не вполне понятно что в целом реализуете?
Для отображения инфо панели с ошибкой во view.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сейчас пока давайте Модель закончим.
А уже дальше будем думать как и что.
Что еще необходимо изменить в модели ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 22:59
Цитата Сообщение от Ihave Посмотреть сообщение
Вопрос: CommonUWP для чего он обычно будет использоваться ?
Общие классы, которые используются несколькими слоями вашего приложения.
CommonStandart - больше расширяться не будет.
В него записываются только те классы реализация которых не зависит от целевой платформы.

Цитата Сообщение от Ihave Посмотреть сообщение
Что еще необходимо изменить в модели ?
Типам ApplicationDataContainer и ApplicationDataCompositeValue не место в Модели.
Для данных, которые нужны от них, я добавлю интерфейс.
А в Модель конструктор:
C#
1
2
3
4
5
6
7
8
9
10
    public interface IModelSettings
    {
        string PostHwid { get; }
 
        string PostDevice { get; }
 
        string UriAPI { get; }
  
        string Key { get; }
  }
C#
1
2
3
4
5
6
7
8
9
    public class SignM
    {
 
        private readonly IModelSettings settings;
 
        public SignM(IModelSettings settings)
        {
            this.settings = settings;
        }
Теперь при создании Модели ей передаются нужные настройки, а она сам не будет лезть в App.

Но возникает проблема с этой строчкой:
C#
60
                        localSettings.Values["Token"] = responsesign.GetSuccess;
Для чего вы это делаете, если вы потом не считываете этот параметр?


Фиксацию сделал - посмотрите.

Добавлено через 5 минут
И параметров у метода Authorizat уже многовато 2 входных, три выходных.
Я бы сделал уже какой-то DTO.

Не даже не так.
Я бы для ошибки сделал отдельный канал - событие.
Но События сейчас совсем вас запутают.
Поэтому для 5 параметров, навеноне, компактнее и понятнее будет void метод и один DTO в его параметре.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 23:14  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для чего вы это делаете, если вы потом не считываете этот параметр?
Потом Токен нужно будет использовать в модели Connect, там просто изменится немного параметры:

C#
1
2
3
4
5
6
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(Settings["UriAPI"] + "/start"));
                request.Method = "POST";
                request.Headers.Add("CLIENTKEY", settings.Key);
                request.Headers.Add("AUTHTOKEN", (string)localSettings.Values["Token"]);
                request.Headers.Add("hwid", settings.HWid);
                request.Headers.Add("device", settings.Device);
Я по сути потом могу записать в settings то что вы сделали и потом использовать, вот тут очень важный вопрос:

Connect используется по сути один раз с заголовками ключ и все, но потом когда надо будет постоянно общаться с сервером нужно в заголовок отправлять токен девайс и айди. Создать для этого другую модель типо connect ? Или как это можно обыграть ?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
И параметров у метода Authorizat уже многовато 2 входных, три выходных.
Я бы сделал уже какой-то DTO.
Все DTO создавать так же в проекте модели ?


У меня проблема с CommonStandart - говорит что не поддерживает null в С# 7.3 используйте версию языка 8.0 или выше
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2022, 23:27
Цитата Сообщение от Ihave Посмотреть сообщение
Потом Токен нужно будет использовать в модели Connect, там просто изменится немного параметры:
Чё-то пропустил этот момент.
За пределами SignM этот токен где-то используется?
Если нет, то в нужно для него в Модели сделать приватное поле.
Если да, то в интерфейсе настроек добавить мутабельное свойство.

Цитата Сообщение от Ihave Посмотреть сообщение
Connect используется по сути один раз с заголовками ключ и все, но потом когда надо будет постоянно общаться с сервером нужно в заголовок отправлять токен девайс и айди. Создать для этого другую модель типо connect ? Или как это можно обыграть ?
Другую точно не надо.
Добавьте пару других методов, чтобы я понял что у них общее.

Цитата Сообщение от Ihave Посмотреть сообщение
Все DTO создавать так же в проекте модели ?
В данном случае, да.
В более общем, обычно на уровне Модели делается библиотека и общие типы (в том числе интерфейс Модели) объявляются там.
А в проекте Модели только реализация её интерфейса и интернал типы.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
12.02.2022, 23:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чё-то пропустил этот момент.
За пределами SignM этот токен где-то используется?
Если нет, то в нужно для него в Модели сделать приватное поле.
Если да, то в интерфейсе настроек добавить мутабельное свойство.
Не используется, только внутри модели будет. Мы просто делаем сейчас только вход, но после входа, для дальнейшего получения всех данных надо будет в заголовок отправлять токен, как я написал вверху.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если нет, то в нужно для него в Модели сделать приватное поле.
Токен обычно выдается на долгое время, поэтому как бы хорошо его сохранять так, чтобы потом когда пользователь закрыл и снова открыл приложение, будет уже авторизаться без логина и пароля, только по токену. Отсюда я использовал хранилище локал.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавьте пару других методов, чтобы я понял что у них общее.
Давайте я сейчас поисправляю свои еще старые ошибки, чтобы приложение запускалось и как будет время вы снова посмотрите уже. Я добавлю так же метод с которым надо будет токен использовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2022, 23:32

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru