Форум программистов, компьютерный форум, киберфорум
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. Показов 9467. Ответов 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, 23:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ihave Посмотреть сообщение
Токен обычно выдается на долгое время,
Долгое - имеется ввиду, что его нужно сохранять между сеансами?
Если да, то значит надо добавить в интерфейс настроек и App перед завершением приложения сохранит его.

Цитата Сообщение от Ihave Посмотреть сообщение
Давайте ...
Как сделаете - напишите.
Я посмотрю.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
13.02.2022, 00:16  [ТС]
Элд Хасп,

Обновил реп, но так и не смог пока запустить программу, ошибку с не поддерживает null в С# 7.3 используйте версию языка 8.0 или выше, не смог решить. Но можно решить это потом, главное сейчас саму суть модели довести.

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

Да нужно хранить, недели две где-то. Там есть проверка токена, которую я реализовал под CheckToken.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.02.2022, 01:50
Ihave, вы умете пользоваться токенами задач?
Если нет то освойте: Использование списка задач.

Добавьте два токена: "RES" - для вопроса и "ANS" - для ответа.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.02.2022, 01:51
Даже ещё третий добавьте REM - для доп. пояснений.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
13.02.2022, 02:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавьте два токена: "RES" - для вопроса и "ANS" - для ответа. третий добавьте REM - для доп. пояснений.
Добавил токены задач в реп...

Спасибо за поправки в CoommonStandart
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.02.2022, 02:36
Ihave, отправил фиксацию 7f5a88da с примером реализации проверки токена.
Там были конфликты слияния, но я вроде их разрулил как надо.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
13.02.2022, 04:43
Ihave, отправил ответы на вопросы фиксация 286165a8.
Вы очень торопитесь и хотите решить все вопросы сразу.
Так не получится.

Для начала запустим работу настроек.
Потом создадим страницу авторизации, интерфейс VM к ней.
Отладочную VM, отладим работу сnраница-VM.
И только после этого в VM внедрим Модель и будем отлаживать всё вместе.

Потом следующую страницу и т.д.
1
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
13.02.2022, 11:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы очень торопитесь и хотите решить все вопросы сразу.
Да просто неудобно ваше время тратить... Но и понимаю, что торопитсья бессмыслено, так мало чего поймешь.

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

Если бы у вас были знания, то можно было бы сократить объяснения.
Но сейчас лучше подробно, детально пройти каждый шаг.

Цитата Сообщение от Ihave Посмотреть сообщение
задал еще пару вопросов с примером в модели.
1) Пока работаем только с настройками Модели. Кто их создал, кто будет сохранять - Модель не интересует. Это забота того кто создал Модель. Чтобы не было соблазнов работы с Приложением, изменил тип проекта на Standard.

2) Изменил возвращаемый тип метода проверки токена на перечисление.

Сейчас немного больше вник в ваше приложение и появился такой нюанс.
В общем случае, вся работа с Хранилищем (Источником Данных) инкапсулируется в Репозитории. И Репозиторий должен быть максимально абстрактным, поэтому возвращать коды ошибок в типе специфичен для Хранилища нельзя.
Но как я понял сейчас, всё ваше приложение - это локальный GUI для WEB Сервера.
То есть, тип Хранилища предопределён условиями ТЗ на само Приложение.
В таком случае, нет задачи абстрагирования от Хранилища и можно возвращать коды (и простые типы) специфичные для Хранилища, то есть HttpStatusCode, но нужно его (наверное) как-то "разбавить" на случай если будет вызвана проверка для отсутствующего токена.

Отправил фиксацию 8d4788cf:
Ответы на вопросы и изменение возвращаемого типа метода проверки токена.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
13.02.2022, 17:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
1) Пока работаем только с настройками Модели. Кто их создал, кто будет сохранять - Модель не интересует. Это забота того кто создал Модель. Чтобы не было соблазнов работы с Приложением, изменил тип проекта на Standard.
Хорошо.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
2) Изменил возвращаемый тип метода проверки токена на перечисление.
Не совсем понял зачем перечисление, там суть не много другая, если response.StatusCode возвращает определеные значения, исходя из этих значений нужно действовать. Не пойму зачем обрабатывать с флагами.

Конструкция там такая, если в response.StatusCode = 200, то загрузка сразу MainPage, если 401 - показать например что не оплачен доступ или что то вроде того, 402. Токен истек и нужно снова авторизаваться и тд

CheckToken, служит больше проверкой на сколько актуальный токен и его так сказать права по ответам HTTP кодов.

Соотвественно, мы должны возвращать StatusCode например в APP и говорить, что именно потом уже показать.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
В таком случае, нет задачи абстрагирования от Хранилища и можно возвращать коды (и простые типы) специфичные для Хранилища, то есть HttpStatusCode, но нужно его (наверное) как-то "разбавить" на случай если будет вызвана проверка для отсутствующего токена.
Да я же говорил, что вы по сути правы, нам нужно только int от HttpStatusCode получить, значение не так важно значение всегда можно самому расшифровать и задать. Поэтому чтобы соблюдать правильность, можно спокойно int оставить, и опять же обойтись без флагов, а просто реагировать на определеный код в int.


Потому что описание всех ввидов и так есть: https://ru.wikipedia.org/wiki/... D1%8F_HTTP


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но как я понял сейчас, всё ваше приложение - это локальный GUI для WEB Сервера.
По сути так и есть, приложение подключается по АПИ и получает все данные. Соотвественно есть правила какие и как данные можно только запросить. Очень кросплатформеная тема. По API ты по сути делаешь все. Есть где то база и работа с базой происходит по API, не важно какое приложение или сайт обращается

Добавлено через 14 минут
Еще раз хочу по модели пробежатся

Модель Connect - служит только для того чтобы получить токен по авторизации. Используется всего один раз, если нету токена или он не действительный.
Модель CheckToken - только проверить действительный ли токен и какие у него права согласно пользователю. Используется только при старте программы или после того как первый раз получили его (когда авторизовываемся по телефону).
Модель GetDaten - получение всех данных! Уже не важно каких. Используется напротяжение всей программы для получение разных данных. В его составе Код Токена, который используется для индетификации пользователя.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.02.2022, 00:20
Цитата Сообщение от Ihave Посмотреть сообщение
Да я же говорил, что вы по сути правы, нам нужно только int от HttpStatusCode получить,
Тогда лучше оставить HttpStatusCode.
Но как быть в случае, если токена нет во время его проверки?
Или можно не обращать внимание на это, какой вернёт код - такой вернёт.


Цитата Сообщение от Ihave Посмотреть сообщение
Еще раз хочу по модели пробежатся ...
У них у всех одинаковая (или почти одинаковая) вот эта часть:
C#
1
2
3
4
5
6
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(settings.UriAPI + PlusUri));
                request.Method = "POST";
                request.Headers.Add("CLIENTKEY", settings.Key);
                request.Headers.Add("AUTHTOKEN", settings.Token);
                request.Headers.Add("hwid", settings.Hwid);
                request.Headers.Add("device", settings.Device);
Её лучше вынести в отдельный метод.

Методы GetNews и GetDaten - правильно состыкованы.
Возможно только стоит в GetNews все параметры и возвращаемые значения, передавать через один входной DTO.
Но это пока не критично, а кортежи удобнее деконструировать в отдельные переменные.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
14.02.2022, 12:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но как быть в случае, если токена нет во время его проверки?
Или можно не обращать внимание на это, какой вернёт код - такой вернёт.
Если токена нет, он вернет определеный код в HttpStatusCode. Поэтому по сути там отслеживаются лишь немногие ответы типо 200,402,403, все остальные можно считать, как "Сеанс истек" и откроется страница с Sign, где пользователь будет снова авторизовываться, чтобы получить новый токен. Из за этого до флагов, я уже сделал структуру с if на HttpStatusCode.

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

Так как в
1) Connect лишь один заголовок (Headers), но есть данные в Poste JSON. Возвращать надо ответ JSON и код статуса HTTP
2) CheckToken 4 заголовка, но нету данных в Poste JSON. Возвращать надо только код статуса HTTP
3) GetDaten 4 заголовка и всегда есть данные в Poste JSON. Возвращать надо ответ JSON и код статуса HTTP

По идее можно 2 и 3 совместить, тогда в CheckToken пустой byte слать и обратно пустой JSON. Но это так себе решение...

А сделать отдельно request, все равно придется делать дополнительные воиды на эти 2 случая

У вас есть идеи ?


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Возможно только стоит в GetNews все параметры и возвращаемые значения, передавать через один входной DTO.
Но это пока не критично, а кортежи удобнее деконструировать в отдельные переменные.
Да я так и понял, я просто навсякий случай спросил, правильная ли у меня теперь мысль, как работать внутри метода с методом...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
14.02.2022, 13:59
Цитата Сообщение от Ihave Посмотреть сообщение
Если токена нет, он вернет определеный код в HttpStatusCode.
Тогда тем более не стоит заморачиваться - пусть возвращает тип HttpStatusCode.
НО! Это верно только в такой конкретной задаче как ваша: "Построение локального GUI для WEB сервера".

Цитата Сообщение от Ihave Посмотреть сообщение
но в итоге у меня получалось что то вроде - "из за перестановки слагаемых, сумма не меняется" вроде как код не уменьшался и не оптимизировался, а просто корзинки с яйцами менялись.
Вполне возможно.
Но суть здесь не в уменьшении кода.
Допусти, в будущем, изменится формат запроса.
Тогда вам придётся в нескольких местах в коде искать где создаётся запрос и менять там.
Это увеличивает риск ошибок в сопровождении продукта.

Поэтому всё надо собрать в одном месте.
Сейчас тугова-то со временем.
Когда будет посвободнее, вникну больше в логику и посмотрю как лучше сделать.

Цитата Сообщение от Ihave Посмотреть сообщение
правильная ли у меня теперь мысль, как работать внутри метода с методом...
Да. Всё верно.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
14.02.2022, 19:59  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сейчас тугова-то со временем.
Когда будет посвободнее, вникну больше в логику и посмотрю как лучше сделать.
Я обновил реп b3dfe19, сделал все что связано с токеном в APP и моделью. У меня остался последний вопрос в APP по модели:

C#
1
            //RES: Установиться здесь токен в локальное хранилище при закрытие ?
Остальные вопросы и комментарии связаные с VM и V, их решим после того, как мы полностью закончим делать модель.

Так что как будет у вас время посмотрите
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 00:22
Цитата Сообщение от Ihave Посмотреть сообщение
RES: Установиться здесь токен в локальное хранилище при закрытие ?
Да. Можно сохранять всегда, без проверки условия.

Цитата Сообщение от Ihave Посмотреть сообщение
Остальные вопросы:
//RES: Как передать информацию о модели в VM и в V о VM.
Я мало знаю UWP.
По идее это нужно сделать при создании страницы в навигаторе.
Скорее всего в App.
Сейчас покопаюсь, посмотрю как сделать.

Добавлено через 2 часа 35 минут
Ihave, вы кусками туда коды закидываете, как их использовать?
Потратил пару часов пока всё выправил.
Закидываете код - делайте так, чтобы Решение можно было запустить.

По существу.
В App подключаете прослушку к фрейму:
C#
77
            rootFrame.Navigated += OnNavigated;
C#
175
176
177
178
179
180
181
        private void OnNavigated(object sender, NavigationEventArgs e)
        {
            if (e.Content is Sign sign)
                sign.SignViewModel = signViewModel;
            else if (e.Content is MainPage main)
                main.SignViewModel = signViewModel;
        }
Возможно в UWP есть и более изящные способы, но это надо интересоваться у тех кто его активное юзает.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 20:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вы кусками туда коды закидываете, как их использовать?
Потратил пару часов пока всё выправил.
Да вчера начал, не успел закончить и забыл закомментировать, то что начал....

Обновил реп - закомментировал лишние...

Цитата Сообщение от Элд Хасп Посмотреть сообщение
По существу.
В App подключаете прослушку к фрейму:
Инетресное решение, но только не доконца понимаю, как на деле будет работать, вы не заливали изменение на реп ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 21:04
Цитата Сообщение от Ihave Посмотреть сообщение
вы не заливали изменение на реп ?
Разве?
Думал залил.
Проверю сейчас.

Добавлено через 8 минут
Ihave, действительно забыл залить.
Чтобы не было путаницы и конфликтов с вашими изменениями добавил ветку eldhasp- посмотрите в ней.
Что нужно перенесите в основную ветку, а эту удалите.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 21:09
Ihave, у меня прошло какое-то обновление, наверное, и теперь в вашем Решении не показывает Дизайнер XAML.
В других Решениях показывает.
У вас как?

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
15.02.2022, 21:31
Ihave, то что я показал это "WPF подход" натянутый на UWP.
Frame+Page не наследуют Контекст Данных от Окна (или вышестоящего элемента).
Их применение рассчитано на то, что Page будет использовать только статические значения (в основном из Ресурсов App) и параметр навигации, задаваемый при переходе на страницу.
Я показал ещё один способ не типичный для Frame+Page.
0
2 / 1 / 1
Регистрация: 17.11.2020
Сообщений: 105
15.02.2022, 21:39  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
у меня прошло какое-то обновление, наверное, и теперь в вашем Решении не показывает Дизайнер XAML.
В других Решениях показывает.
У вас как?
Да это автоматическии походу у меня обновил он до актуальной версии, так как буквально недавно накатил себе Windows 11...

Цитата Сообщение от Элд Хасп Посмотреть сообщение
то что я показал это "WPF подход" натянутый на UWP.
Frame+Page не наследуют Контекст Данных от Окна (или вышестоящего элемента).
Их применение рассчитано на то, что Page будет использовать только статические значения (в основном из Ресурсов App) и параметр навигации, задаваемый при переходе на страницу.
Я показал ещё один способ не типичный для Frame+Page.
Понял попробую сейчас разобраться во всем и отпишусь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2022, 21:39

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru