|
1 / 1 / 1
Регистрация: 27.05.2022
Сообщений: 168
|
||||||||||||||||
Обработка ввода не числового значения с соблюдением MVVM11.07.2025, 19:05. Показов 1140. Ответов 13
Хочу сделать так, чтобы при вводе в текстовое поле не цифр или числа, не попадающего в диапазон от 0 до 100, кнопка становилась недоступной. Второй пункт успешно выполнен, но с реализацией первого проблемы: если поставить точку останова на строчку cost = value и ввести в поле букву, то можно увидеть, что программа не доходит до этой строки.
MainWindow.xaml
MainWindow.xaml.cs
ViewModel.cs
0
|
||||||||||||||||
| 11.07.2025, 19:05 | |
|
Ответы с готовыми решениями:
13
Объединение массивов с соблюдением упорядоченности |
|
1 / 1 / 1
Регистрация: 27.05.2022
Сообщений: 168
|
|
| 11.07.2025, 20:33 [ТС] | |
|
Я это понимаю, но есть ли способ обойти это?
0
|
|
|
Модератор
|
||
| 11.07.2025, 20:49 | ||
|
1) Ввод только числовых значений в свойство-источник. Это "стандартный" подход в WPF, о чем и написал вам wizard41. В этом случае валидация в VM сводится только к валидации самого уже полученного численного значения. 2) Полная валидация текстового поля в ViewModel. Это возможно, то что вы имели ввиду. В этом случае в VM нужно тестовое свойство. Его сначала нужно конвертировать в численное. Если не возможно, то выдать ошибку валидации для конвертации. А потом уже проверить на диапазон и выдавать такую ошибку. P.S. 1) Советую использовать базовую реализацию INPC, а не каждый раз "с нуля" её делать. Для примера можете взять отсюда: Простые реализации для тем на форуме 2) Вместо IDataErrorInfo лучше применять INotifyDataErrorInfo3) Задавать контекст данных лучше в XAML. Это можно сделать несколькими различными способами. Даже в сложных случаях, когда такое невозможно, надо задать хотя бы контекст данных времени разработки.
0
|
||
|
|
||
| 11.07.2025, 21:11 | ||
|
Либо вводится число и затем происходит проверка диапазона, либо вводиться не число и оно отклоняется еще на уровне View. Можно конкретно написать свой валидатор и в нем прописать свою логику реагирования на то или иное.
0
|
||
|
Модератор
|
|||||||
| 11.07.2025, 21:41 | |||||||
0
|
|||||||
| 17.07.2025, 06:21 | ||||||||||||||||
|
Мне кажется, что задачу можно и нужно решить на уровне View.
Кликните здесь для просмотра всего текста
Правило. Кликните здесь для просмотра всего текста
моделька Кликните здесь для просмотра всего текста
P.S. Есть одно НО, то самое, с которым я тоже в своё время боролся - это кнопка. Проблема в том, что VM всегда "видит" только валидную модель, поэтому просемафирить кнопке можно только реализуя проверку на уровне VM. Как сделать проверку на уровне VM Элд Хасп уже написал, остаётся только кнопке указать команду и для неё наложить ограничение CanExecute. Добавлено через 4 минуты Кстати, Элд Хасп, подскажи как прямо во вью проверить состояние валидации поля Cost, чтобы установить у кнопки, например тот же IsEnabled="{Binding чего-то там}".
0
|
||||||||||||||||
|
|
|||
| 17.07.2025, 08:36 | |||
|
CanExecute() сам включит/отключит кнопку.
0
|
|||
|
|
|||||||||
| 17.07.2025, 09:34 | |||||||||
Добавлено через 17 минут
0
|
|||||||||
| 17.07.2025, 10:23 | ||
|
Если подумать, то возникает вопрос "зачем вообще во View вшита валидация?" Ответ в общем-то тоже понятен - для упрощения разработки. Проблема в том, что WPF не разрабатывалась под паттерн MVVM, а как раз наоборот. Отсюда и вот такие коллизии возникают.
0
|
||
|
|
||
| 17.07.2025, 10:43 | ||
|
Uswer, Если почитать книгу по привязкам в формах, то там вообще валидация делается в модели. Я к чему это всё... Вы ведь сами писали про CanExecute() на кнопке - ведь именно он разрешает выполнение команды. Некорректные данные при вводе (UpdateSourceTrigger="PropertyChanged" обновляет свойство на лету, при вводе) - команда не доступна, свойство выдаёт ошибку валидации при вводе - красная рамка с подсказкой, откуда прилетит IDataErrorInfo не важно, свойство прошло -> CanExecute() сработал -> команда выполнилась.
И вот это замечание тоже важно
0
|
||
| 17.07.2025, 11:02 | |
|
Andrey-MSK, наверное я плохо излагаю, моя вина. В ответе я указал сразу на два возможных решения. Первое то, что указано кодом, а второе в P.S. И этим я всех запутал. В моей голове это два независимых варианта: либо валидация только во View, либо в VM через INotifyDataErrorInfo.
0
|
|
|
Модератор
|
||
| 17.07.2025, 23:51 | ||
|
Здесь вопрос больше по разделению функционала: должен это делать именно View, а не ViewModel? Кнопка выполняет действие уровня VM или Модели? Такая валидация это ограничение GUI (View) или Бизнес-Логики (Model)? ТС предоставил очень мало информации. Фактически он описал не "что нужно сделать", а "как он хочет сделать". Поэтому дать верный во всех смыслах ответ невозможно. ТС хочет свою кастомную валидацию даже приведения строки к числу. На мой взгляд, ограничение диапазона Cost - это ответственность Модели (она может её делегировать VM). Но вот приведение строки к числу -это ответственность View. Что мы получаем в итоге. Состояние команды зависит от валидации диапазона Cost, но у команды нет информации о валидации приведения строки к числу. Поэтому может получиться, что Юзер ввел неверное значение, при этом в свойстве VM Cost валидное по диапазону значение. Но пользователь его не видит и кнопка при этом активна, так как команда в VM валидна. Как с этим бороться. По сути два варианта: 1) Дополнительно через IsEnabled кнопки отключать её, если есть ошибки в GUI. Например можно использовать для агрегации всех ошибок такое решение: Как получить ошибки валидации от всех дочерних элементов [WPF, Элд Хасп] 2) Создать сложный аргумент команды и прокидывать через него в команду из View нужные зависимости. Я лично предпочитаю второй вариант. Это упрощает понимание кода, вся валидации происходит в одном месте - в команде VM.
0
|
||
| 17.07.2025, 23:51 | |
|
Помогаю со студенческими работами здесь
14
Потоки - запуск одновременно с соблюдением порядка присвоения
Как добавлять данные в DataGrid через Textbox со связкой с SQLite при соблюдении MVVM ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|