Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468

Приложение MVVM, VMs и навигация: Создание Модели Авторизация.

08.02.2023, 19:59. Показов 2442. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В этой теме обсуждается только вопросы по созданию Модели для Авторизации пользователя.
Основная тема: Приложение MVVM. VMs и навигация
Здравствуйте.
Имеются следующие вопросы.
Как при соблюдении mvvm передать в VM свойства view такие как SelectedItem? Знаю, что можно передавать через параметр команды, но в моем случае за раз в VM нужно отправить 2 объекта - логин и пароль (в модели у меня нет этих свойств, соответственно, я не должен определять их в VM. Хотя многие так делают, но это всё-таки нарушение). Нашёл решение с помощью применения MultiBinding для параметра, но мне кажется, что это слишком громоздко, так как при таком подходе каждый раз придется реализовывать конвертер. Вообще, говоря, очень трудно приходится, когда в VM нет нужных свойств, от этого обстоятельства не выходит отключать кнопку (альтернативой может служить триггер на свойство IsEnabled во view, но от этого снова приходится прикладывать больше усилий из-за описания стиля и, возможно, конвертера. Элд Хасп подсказывал, что для этих целей можно сделать прокси класс, но я недоумеваю как и где. Было бы удобно, если бы по правилам mvvm в VM допускалось хранить все необходимые свойства, а не только те, которые имеются в модели.

По той же причине не стал помещать в VM команду для кнопки, которая предназначена для входа в роли гостя. Пока что в коде view подписал хелпера на щелчок по ней. В результате просто должен произойти переход к другому view, это не логика модели. Сама навигация вызывает дополнительный вопрос, нужны рекомендации по её реализации.

Также можно отдельно рассмотреть модель. Правда там пока что немного кода. Важны все замечания.

Ещё имеется dll библиотека с вспомогательными классами, применимыми к mvvm. По ней тоже можно сделать замечания.

Вот ссылка на репозиторий https://github.com/INexteR/NewTrade/tree/Trial. В нем также содержится документ с заданием.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2023, 19:59
Ответы с готовыми решениями:

Приложение MVVM. VMs и навигация
Здравствуйте. Имеются следующие вопросы. Как при соблюдении mvvm передать в VM свойства view такие как SelectedItem? Знаю, что можно...

Навигация по страницам wpf и mvvm
Здравствуйте Подскажите, плиз, есть ли способ , в рамках паттерна mvvm, вернутся на исходную страницу, без использования кнопок...

Навигация страниц UWP MVVM
Добрый день! Мой проект состоит из 3х страниц: 1. Загрузка данных с сервера; 2. Расчётные операции на основе этих данных; 3....

36
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.02.2023, 16:47  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп, удивительно, но блокировка на самом деле исчезла, когда я сделал синхронную версию, обернутую в Task.Run

Добавлено через 36 секунд
Но а в чем кроется проблема в моей реализации?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2023, 16:59
Цитата Сообщение от INexteR Посмотреть сообщение
Но а в чем кроется проблема в моей реализации?
Это надо дебажить.
А я не могу этот код у себя проверять - нет сервера.
И ставить его нет желания - и так комп захламлён выше крыши.

Для общего развития почитайте эти темы:
Где моя асинхронность?
Как правильно использовать async?
Асинхронность в .NET и C# в частности. async/await и Task
1
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
12.02.2023, 17:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это надо дебажить.
Хорошо, буду выяснять. Спасибо за ссылки
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2023, 19:24
Цитата Сообщение от INexteR Посмотреть сообщение
Хорошо, буду выяснять.
Там скорее все с циклом перемудрили.
По факту он происходит в синхронном потоке.
И само определение пользователя сделали неверно.
Скиньте фиксацию с синхронным методом - я подправлю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2023, 22:09
INexteR, посмотрел интерфейсы.
Забыли про событие - добавил его.
И дополнил документацию.
См. Добавлено событие изменения состояния авторизации. И дополнена XML до… .

Теперь можно сделать реализацию этих интерфейсов в Модели.

Типы будут реализовываться по такому принципу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using Interfaces;
 
namespace ShopModel.Entities
{
    internal class RoleEntity : IRole
    {
        // Явная реализация интерфейса.
        int IRole.Id => Id;
        string IRole.Name => Name;
        Rights IRole.Rights => Rights;
 
        // Свойства, которые доступны только внутри сброки.
        internal int Id { get; set; }
        internal string Name { get; set; } = string.Empty;
        internal Rights Rights { get; set; }
    }
}
Сделайте сами, что можете.
В рабочие дни я смогу только смотреть код и здесь в теме предлагать изменения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.02.2023, 22:14
Метод LoginAsync, скорее всего, не понадобится.
Метод Login будет "мгновенный".

Ещё подумайте нужен ли метод или методы первичной верификации логина и пароля?
Например, на минимальную длину и допустимые символы.

Что-то в таком духе string VerifyLogin(string login) - возвращает либо пустую строку, либо сообщение об ошибке.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
23.03.2023, 16:36  [ТС]
Элд Хасп, вопрос по модели. Почему мы сделали класс IShop производным от IAuthorization? Я согласен с тем, что система магазина может содержать раздел авторизации как у нас, но в то же время магазин не обязательно является авторизацией. По-моему правильным выбором здесь будет отношение "содержит": магазин содержит авторизацию. А у нас сформировано отношение "является". Изначально я поместил объект авторизации в объект магазина, смоделировав тем самым отношение "содержит", но Вы этот вариант исправили
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.03.2023, 20:04
Цитата Сообщение от INexteR Посмотреть сообщение
По-моему правильным выбором здесь будет отношение "содержит": магазин содержит авторизацию.
Там же в комментах указано, что это сделано для упрощения реализации.
Так же не путайте интерфейсы и базовый класс.
Интерфейс как раз таки и сообщает, что тип "что-то содержит", а не то что он "чем-то является".

Например, IComparable сообщает, что тип содержит метод сравнения. Но никак не говорит о том, что тип сам является компаратором.

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
Изначально я поместил объект авторизации в объект магазина, смоделировав тем самым отношение "содержит", но Вы этот вариант исправили
Если считаете, что уже набрались опыта - попробуйте реализовать.
По возможности - помогу.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
23.03.2023, 20:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если считаете, что уже набрались опыта - попробуйте реализовать.
Да что там реализовывать, просто к авторизации обращаться через точку после объекта IShop
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
06.04.2023, 15:24  [ТС]
Элд Хасп, здравствуйте. Есть следующий вопрос. Мне необходимо отправить информацию об элементах в word, напечатать в нем. Какой слой должен выполнять эту задачу? Я предполагаю, что в модели должен быть метод, возвращающий коллекцию для печати, то есть он будет только формировать её для вызывающего кода
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2023, 21:19
Цитата Сообщение от INexteR Посмотреть сообщение
Какой слой должен выполнять эту задачу?
Что такое "отправить в word"?
Однозначно же это не показать данные в Окне.
Значит это Модель.
А уже как в Модели это реализовано: статическая служба из методов, какой объект-Модель, Репозиторий и др. - это всё детали реализации Модели (слоя).
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
06.04.2023, 21:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что такое "отправить в word"?
Напечатать в документе текст на основе данных

Добавлено через 22 минуты
Элд Хасп, а вот помните такое требование в задании, где нужно было удалить изображение из папки проекта. Почему это не могла делать модель?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2023, 22:03
Цитата Сообщение от INexteR Посмотреть сообщение
Почему это не могла делать модель?
Условно View, VM и Model - работают на трёх разных компьютерах.
Папка с файлами расположена на компьютере с View. И Модель просто "не видит" этой папки.

Добавлено через 4 минуты
Забыл ещё об одном ГЛАВНОМ!!! слое: App. Как запускается приложение, в каких папках находится сборка и т.п. знания - это прерогатива App. Просто в данной реализации у нас View и App находится в одном проекте, поэтому граница между ними размыта.

Цитата Сообщение от INexteR Посмотреть сообщение
Напечатать в документе текст на основе данных
"Документ" - это файл.
Созданием файлов, их изменением может заниматься либо Модель, либо App (App может всем заниматься).

Добавлено через 1 минуту
Цитата Сообщение от INexteR Посмотреть сообщение
удалить изображение из папки проекта. Почему это не могла делать модель?
Правильно было бы создать отдельную Модель для работы с файлами изображений.
Но делать это ради пары методов.... лень.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
07.04.2023, 08:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Просто в данной реализации у нас View и App находится в одном проекте, поэтому граница между ними размыта.
А как же их поделить. Ведь при создании приложения в нем уже сразу включено окно и класс App
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2023, 20:20
Цитата Сообщение от INexteR Посмотреть сообщение
А как же их поделить. Ведь при создании приложения в нем уже сразу включено окно и класс App
Ну, мало-ли где, что и как включено?
Вы вообще видели в Студии шаблоны не проектов, а многопроектных приложений?
Тот же паттерн MVVM (или MVC/MVP). Где шаблоны под их реализацию?
Их попросту нет.
И теперь это значит, что все Решения нужно делать однопроектными? Нет, конечно.

Разделение WPF View и App сложно только из-за того, что почти всегда многие ресурсы задаются в App.
А при реализации View в другом проекте Дизайнер XAML их не будет видеть.
Поэтому в простых (и не только) реализациях WPF View и App бывают в одном проекте.
Но то что они в одном проекте это же не означает что это ОДНО И ТО ЖЕ.
0
 Аватар для INexteR
17 / 16 / 1
Регистрация: 25.01.2023
Сообщений: 468
08.04.2023, 09:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы вообще видели
Не видел
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но то что они в одном проекте это же не означает что это ОДНО И ТО ЖЕ.
Хорошо, надо будет когда-то это деление выполнить
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
08.04.2023, 10:13
Цитата Сообщение от INexteR Посмотреть сообщение
Хорошо, надо будет когда-то это деление выполнить
Для эксперимента - можно.
Но глобально там придётся решат проблему ресурсов App для режима разработки.
По факту это обычно выливается в то что проекты, использующие ресурсы App, всё равно имеют тип "Приложение WPF", но собираются не в exe, а в dll.
И все ресурсы App, используемые View, также задаются и в проекте View. Может не в полном размере, но в достаточном для работы Дизайнера XAML без ошибок и предупреждений.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2023, 10:13

Свойства модели в MVVM
Здравствуйте. Если следовать паттерну MVVM стоит ли у модели свойства делать закрытыми от изменения извне? То есть private set? Во...

IdHttp авторизация + навигация по сайту
Собственно интерисует как сделать такое? 1.) нужно авторизироваться(Ну это я знаю - пост запросом) 2.) навигация по сайту уже...

MVVM работа со списком в модели
ПОмогите разобраться что куда и как. Возьмем такой пример: окно, при открытии текстового файла выводятся строки формата Дата:строка. ...

Авторизация в БД MySQL MVVM
Здравствуйте. Вопросов несколько. 1. Есть XAML <Window x:Class="BCI_Demo.LoginUser" ...

MVVM Light и оповещения об изменениях модели
В общем есть модель private int _id; private int _contrId; private double _course; public int Id...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
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, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru