1 / 1 / 1
Регистрация: 18.12.2015
Сообщений: 12
|
|
1 | |
MVVM ответ на действие пользователя13.12.2021, 13:00. Показов 1108. Ответов 10
Привет! Как реализовать ответ на запрос пользователя в паттерне MVVM? У меня на форме есть кнопка на которой висит команда, описанная в ViewModel, эта команда вызывает метод модели. Как мне уведомить пользователя о том что все успешно выполнено, или что команда не может быть выполнена по таким то причинам? C# WPF
0
|
13.12.2021, 13:00 | |
Ответы с готовыми решениями:
10
Тест по делфи не сверяет ответ пользователя и правильный ответ из ini файла Найти пользователя и выполнить действие Отследить действие пользователя (за компьютером он или нет) Помощь в реализации вопросов о Скроле и подтверждении на действие пользователя. |
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
13.12.2021, 13:18 | 2 | |||||
Xristian, вообще, если Вам достаточно метода "сделать на коленке", то всего одна строка:
Я бы сделал отдельную, кастомную визуализацию окна ошибки. Далее определился бы с стилистикой приложения, ибо диалоговое окно не всегда уместно (зачастую способ оповещения пользователя реализовывают, как часть интерфеса). Ну и потом бы вызвал эту визуализацию, передав в неё соответствующую информацию. Добавлено через 5 минут Всё напрямую зависит от подхода. Их очень много и неясно, как видите это Вы.
1
|
1 / 1 / 1
Регистрация: 18.12.2015
Сообщений: 12
|
|
13.12.2021, 13:41 [ТС] | 3 |
Это очевидное решение, просто вызвать в модели показать сообщение. Я бы хотел сделать это, придерживаясь принципа mvvm, а по нему модель не вмешивается в представление. В идеале, я бы хотел сделать уведомления которые будут появляться в нижнем левом углу, старые будут сдигаться вверх а новые появляться снизу формы, и чтобы они со временем исчезали. Я не понимаю как это можно сделать используя mvvm?
Как я себе это представляю, можно создать в модели observablecollection в которую добавлять ответы на запросы, а viewmodel по подписке будет получать обновления этой коллекции и разбирать на отдельные блоки для показа. Наверное я ответил на свой вопрос) Спасибо Вам за ответ.
0
|
13.12.2021, 13:59 | 4 |
Это можно задать через параметр RelayCommand - CanExecute(object obj), если объект не удовлетворяет условию, то команда не выполнится и UI-элемент, который к ней привязан, не будет активен.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
13.12.2021, 14:05 | 5 | |||||||||||||||
В таком случае, на уровне архитектуры это делается следующим образом: в Моделе у Вас вызывается ошибка -> в ViewModel -- обрабатывается -> в View -- отображается.
Не советую использовать "void", так как ошибка может просто кануть в лету. Но сейчас это не суть важно. Пример:
Допустим я изменю метод модели следующим образом:
Поэтому с Model ошибка поднимается в ViewModel и обрабатывается уже там. Это что касаемо "принципа mvvm".
1
|
1286 / 865 / 258
Регистрация: 08.08.2014
Сообщений: 2,468
|
|
13.12.2021, 14:44 | 6 |
CanExecute для этих целей не особо подходит. Наиболее типовой сценарий его использования - заблокировать кнопку на время выполнения асинхронной команды. Во всех же прочих случаях, засеренная кнопка вызывает у пользователей вопросы и куда разумнее позволить её нажать даже в заведомо невалидном состоянии VM и потом сказать пользователю в чём он неправ (не заполнил что-то, или заполнил неправильно, или фаза луны не та).
Это уже не говоря о том, что основная валидация выполняется на стороне модели, а модель может быть далеко в интернете, и для валидации ей, вероятно, нужно передавать кучку данных, а CanExecute может спамиться непредсказуемо часто.
0
|
13.12.2021, 14:56 | 7 |
А почему бы не передавать в модель уже чистые данные, готовые для использования? VM проведёт всю обработку, отдаст готовые данные в модель, а та уже сама определит их куда надо (в БД так в БД, в файл так в файл)...
0
|
1286 / 865 / 258
Регистрация: 08.08.2014
Сообщений: 2,468
|
|
13.12.2021, 15:03 | 8 |
Потому что валидация данных - это задача модели. Потому что модель - это, как правило, какой-то внешний API, а на стороне клиента от модели остаётся лишь набор прокси-классов (ну и немного кэширования).
И API (модель) ну никак не может доверять валидации, которая [не] была выполнена на стороне UI. Т.е. часть валидации да, можно продублировать и на стороне UI, просто для оптимизации, но модель при этом всё равно должна на своей стороне обеспечить полную валидацию. Добавлено через 1 минуту Но даже если клиент толстый и модель находится на его стороне, то с точки зрения переиспользования её логики, вся валидация должна находиться именно в модели. Просто чтобы не дублировать эту логику в каждой VM, которая решит с этой моделью поработать.
1
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
13.12.2021, 15:16 | 9 | |||||||||||||||
Сообщение было отмечено Xristian как решение
Решение
Накидал пример. Очень грубый, но для базового понимания:
Главня VM содержит список ошибок и подписку для отображение ошибок на View.
Я не парился я просто взял проект из другой темы.
Тут, понятное дело, не хватает анимаций, кучи обработок, навигации и т.д, но это не касается темы. Например я задал DataContext напрямую из xaml.cs файла -- это не совсем корректно, но это отдельная, ёмкая тема. WpfApp1.7z
2
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
13.12.2021, 15:31 | 10 | |||||||||||||||
Ну и не будет лишним показать, как я обрабатываю ошибки в Xamarin-приложении. Стараюсь обрабатывать следующие ситуации:
- Есть ли у меня интернет? - Бежит ли сервис на сервере? - Случилась ли какая-то беда? Покажу на примере уже выше изложенного кода, но в этот раз вызову не Foo, а Task, который возвращает студента.
2
|
Модератор
|
|
13.12.2021, 15:36 | 11 |
Примерный алгоритм:
1) Первый уровень: простейшая валидация данных в методе Execute команды. Если данные не валидны, то кнопка отключается. Но здесь можно сделать только простейшую валидацию, так как она вызывается очень часто в UI потоке; 2) Второй уровень: Вызов метода модели возвращающего данные о валидации. Эти данные обрабатываются в методе Execute команды и при необходимости устанавливается флаг ошибки (или другое свойство) или вызываете делегат диалога уведомления об ошибке. В этом уровне может быть уже более серьёзная обработка, но ё равно не очень длительная так как Execute тоже выполняется в UI потоке. И даже если применить асинхронность, то подразумевается достаточная быстрая реакция после клика пользователя. Не микросекунду, но и не секунды. Максимум десятые доли секунды; 3) Третий уровень: после первичной валидации Модель вызывает свой асинхронный метод. В этом методе тоже могут ошибки, исключения. И для уведомления о них нужно предусмотреть отдельный канал в Модели. Это может быть событие, свойство, метод обратного вызова, какой-то сервис и т.д. VM получает данные из этого канала и извещает об этом View, втом числе путём вызова делегата диалога для таких сообщений.
0
|
13.12.2021, 15:36 | |
13.12.2021, 15:36 | |
Помогаю со студенческими работами здесь
11
Сравнить ответ пользователя с верным Сравнить правильный ответ с ответом пользователя Привязать ответ пользователя к переменной aiogram Как получить ответ пользователя в переменную Проверить ответ пользователя - вычисление выражения Как сохранить ответ от пользователя Телеграмм бота ForceReplay как записать ответ пользователя в переменную? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |