MVVM блокировка кнопки до валидации10.04.2025, 10:56. Показов 6476. Ответов 71
Метки нет (Все метки)
Добрый день.
Исходные данные: разработка в шаблоне MVVM, у некоего окна есть кнопка "ОК", к которой в xaml привязана команда из VM. Также на уровне VM делается валидация данных при помощи INotifyDataErrorInfo. При открытии окна кнопка "ОК" доступна для нажатия хотя дефолтные данные в окне не валидны. Кнопка блокируется если начать вводить не правильные данные, то есть кнопка реагирует только тогда, когда начинает работать механизм валидации. Вопрос в следующем: как при открытии окна сделать кнопку "ОК" недоступной для нажатия с сохранение её зависимости от CanExecute изменяемой при валидации? Добавлено через 5 минут Дополнительное пояснение. Допустим есть одно текстовое поле, которое не может быть пустым и эта проверка делается в VM, после чего устанавливается HasErrors, на который и реагирует кнопка. Но сразу после открытия окна поле пустое и если его не трогать оно также остаётся пустым (не валидным), но в этом случае HasErrors не устанавливается.
0
|
|
| 10.04.2025, 10:56 | |
|
Ответы с готовыми решениями:
71
Обработка валидации данных в слое VM (MVVM)
|
| 13.04.2025, 22:14 [ТС] | ||
|
0
|
||
|
Модератор
|
||||||||||||
| 13.04.2025, 22:23 | ||||||||||||
|
Тогда нет, вообще, смысла в команде SaveCommand. Её нужно перекинуть в MainVM.
Добавлено через 1 минуту Зачем, вообще, нужен PersonDTO в PersonViewModel?Только лишняя морока с ним. Добавлено через 2 минуты
0
|
||||||||||||
|
Модератор
|
|||||||||||
| 13.04.2025, 22:31 | |||||||||||
|
Переходим к
MainWindowViewModel.Добавлено через 1 минуту
Её вполне можно редактировать напрямую в DataGrid. В такой реализации теряет смысл отдельное окно добавления. Добавлено через 1 минуту
VM напрямую управляет окном. Это грубейшее нарушение MVVM. Добавлено через 2 минуты В таком как у вас функционале, я бы в слое VM оставил только MainWindowViewModel.Команда AddPersonCommand должна быть перенесена в View.PersonViewModel - тоже особого смыла находится в слое в VM нет.Надо команду SaveCommand перенести в MainWindowViewModel, а сам PersonViewModel в слой View.
0
|
|||||||||||
| 13.04.2025, 22:44 [ТС] | |||
|
Добавлено через 8 минут
0
|
|||
|
Модератор
|
||
| 14.04.2025, 07:49 | ||
|
Поэтому вам трудно понять границы функционала. В моём примере (pull request) бизнес логика - это создание Person, поддержание локального кеша people. функции по его изменению (пока реализовано только добавление Person). Следовательно функция ViewModel - это отражение этой Бизнес-Логики в eдобном для View виде. Теперь подумаем. Открытие Окна AddPerson как-то меняет на модель, задействует бизнес-логику (описанную выше)? Нет. Бизнес логика здесь не причём. Следовательно, раз состояние Модели не меняется, то и её отражение в VM не должно меняться. Отсюда очевидный вывод. Если из PersonViewModel убрать команду SaveCommand, то там вовсе не остаётся никакой связи с моделью, с бизнес логикой. А команда SaveCommand даже в нынешнем функционале, по сути это просто прокидывание логики MainVM и нет никакой необходимости в такой прокси команде. В View можно сразу использовать команду из MainVM. Вот и получается, что PersonViewModel никак не относится к слою VM. Возможно вас немного путает задание Контекста Данных. Многие воспринимают Контекст Данных = ViewModel. Но это не так. Контекст Данных - это просто способ задания источника по умолчанию для привязок. Чаще всего в нём бывает VM, но это просто вопрос удобства работы и упрощения реализации. Это не обязательное условие. У вас может VM состоять из множества отдельных источников. И ни один из них может не быть в Контексте Данных конкретного окна. Например в вашей задаче напрашивается, создание экземпляра MainVM в ресурсах App (можно непосредственно или в свойстве локатора). Основное Окно получает его из ресурсов App, а не создаёт самостоятельно. А Окно AddPerson в свой контекст получает прокси сущность PersonVM. Но при этом за командами будет обращаться к экземпляру MainVM в ресурсах App.
0
|
||
|
Модератор
|
||||||||
| 15.04.2025, 11:07 | ||||||||
|
Может в процессе объединения что-то потерял. Проверю сейчас. Добавлено через 8 минут Отправил фиксацию. Добавлено через 10 минут Правильная реализация RaiseErrorsChanged:
0
|
||||||||
| 15.04.2025, 11:07 | |
|
Избежать одновременного выполнения LostFocus и команды кнопки MVVM
Добавление кнопки в форме с кнопки и смена фона новой кнопки Временное отключение валидации Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|