Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1

MVVM блокировка кнопки до валидации

10.04.2025, 10:56. Показов 6449. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Исходные данные: разработка в шаблоне MVVM, у некоего окна есть кнопка "ОК", к которой в xaml привязана команда из VM. Также на уровне VM делается валидация данных при помощи INotifyDataErrorInfo. При открытии окна кнопка "ОК" доступна для нажатия хотя дефолтные данные в окне не валидны. Кнопка блокируется если начать вводить не правильные данные, то есть кнопка реагирует только тогда, когда начинает работать механизм валидации.

Вопрос в следующем: как при открытии окна сделать кнопку "ОК" недоступной для нажатия с сохранение её зависимости от CanExecute изменяемой при валидации?

Добавлено через 5 минут
Дополнительное пояснение. Допустим есть одно текстовое поле, которое не может быть пустым и эта проверка делается в VM, после чего устанавливается HasErrors, на который и реагирует кнопка. Но сразу после открытия окна поле пустое и если его не трогать оно также остаётся пустым (не валидным), но в этом случае HasErrors не устанавливается.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2025, 10:56
Ответы с готовыми решениями:

Обработка валидации данных в слое VM (MVVM)
Доброго дня всем. Понимаю, что тема избита, но так как я только изучаю WPF и его применение в...

Рисую линию без MVVM все ОК. C MVVM произвольный старт
Добрый день всем. Рисую линию при помощи анимации. Все получилось -рисуется, стирается. Но у...

Приложение MVVM. Быстрая "Нестрогая MVVM" реализация
В этой теме будет размещена простая и быстрая реализация. Основная тема:...

71
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 14:32
Студворк — интернет-сервис помощи студентам
З.Ы.
HasErrors как-то не так тут работает... Команда SaveCommand активна всегда, при любом вводе имени или его отсутствия вообще..

Добавлено через 27 секунд
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
RelayCommand() находится в корне проекта
аа.. увидел, точно. Ну это пока не так важно, на самом деле.

Добавлено через 3 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
аа.. увидел, точно.
Переместил в папку Components... Вместе с классом ObservableObject
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 14:34
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну это пока не так важно, на самом деле.
С точки зрения шаблона - важно и ещё как
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 14:44
    
Вложения
Тип файла: 7z DTO-Validation.7z (91.5 Кб, 6 просмотров)
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 14:50
wizard41, Хмммм, нужно взять на заметку
C#
1
2
3
4
5
protected override void RaiseErrorsChanged(DataErrorsChangedEventArgs e)
{
    SaveCommand.RaiseCanExecuteChanged(); // вот это
    base.RaiseErrorsChanged(e);
}
1
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.04.2025, 14:51  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И что RelayCommand() делает в слое View?
Не View, а App.
Накидал наспех, поэтому не сильно раскладывал.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Я ведь не зря про это спросил
Понимаю, но до туда пока не дочитал
Цитата Сообщение от Элд Хасп Посмотреть сообщение
За пример (на котором показать реализацию) это можно использовать?
Ради этого пример и создавался. Причём на скорую руку.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 14:52
wizard41, А, оно там было, чёт не увидел
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 14:53
Andrey-MSK, ну я вообще то немного по другому делаю..
Надо с HasError разобраться, тут чето вообще он не фурычит на поле ввода имени..
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.04.2025, 14:57  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
чето вообще он не фурычит на поле ввода имени
Хм, фурычит - нельзя Васям и пустой строке.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 14:59
Uswer, Чего-то это мне не нравится - ObservableObject...
Может так лучше?
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
using System.ComponentModel;
using System.Runtime.CompilerServices;
 
using Services.Interfaces;
 
namespace VModels.Base
{
    public class BaseViewModel : INotifyPropertyChanged, IBaseViewModel
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 
        protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
        {
            if (Equals(field, value))
                return false;
 
            field = value;
 
            OnPropertyChanged(PropertyName);
 
            return true;
        }
    }
}
Добавлено через 1 минуту
Uswer, И потом в свойствах вот так делать
C#
1
2
3
4
5
6
7
8
9
10
11
12
public SynchronizationContext ViewContext
{
    get => _viewContext;
    set
    {
        if (Set(ref _viewContext, value))
        {
            if (ViewContext != null)
                _taskQueue.QueueBackgroundWorkItem(LoadVMDataAsync);
        }
    }
}
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 15:00
Цитата Сообщение от Uswer Посмотреть сообщение
Хм, фурычит
не фурычит.... ))

С пустыми именами пиплы создаются спокойно..
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 15:01
Цитата Сообщение от Uswer Посмотреть сообщение
и пустой строке
На пустой строке кнопке не должна быть активной...
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.04.2025, 15:15  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Чего-то это мне не нравится - ObservableObject
Признаюсь - свиснул в чистую у kolorotur.
Цитата Сообщение от wizard41 Посмотреть сообщение
С пустыми именами пиплы создаются спокойно..
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
На пустой строке кнопке не должна быть активной...
Так а я про что всю тему веду? Именно про это!

Добавлено через 2 минуты
Если в поле Name что-то вбить, а потом стереть, то валидация отработает. НО если не трогать ничего то моделька остаётся невалидной.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 15:21
Цитата Сообщение от Uswer Посмотреть сообщение
Признаюсь - свиснул в чистую у kolorotur.
Я тоже где-то свистнул, скорее всего у Элд Хасп

Добавлено через 1 минуту
Uswer, Я уже свой RelayCommand() прикрутил, всё равно не работает...
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.04.2025, 15:24  [ТС]
Andrey-MSK, я пока в свои VM не встраивал ViewContext. У меня VM связываются с View через делегаты. Но идея понятная.

Добавлено через 2 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
всё равно не работает...
Во-о-от! Уже лучше, я не одинок. И что делать?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 15:29
Цитата Сообщение от Uswer Посмотреть сообщение
я пока в свои VM не встраивал ViewContext
Да я не ViewContext показывал, а метод, который выполняется при изменении свойства
C#
1
if (Set(ref _viewContext, value))
и делает всякие штуки-дрюки с INPC.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 15:34
Да уже примерно понятно в чем дело. Просто в BaseVM накручено малость не для этого сценария.
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.04.2025, 15:34  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
делает всякие штуки-дрюки с INPC.
Так у меня тоже такое есть только в основном проекте.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
11.04.2025, 15:39
wizard41, Uswer, При запуске окна не проверяется ни одно свойство VM и потому HasErrors=False
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
11.04.2025, 15:52
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
не проверяется ни одно свойство VM
Именно. Про это я и пел ранее, вот надо определить почему...
Сам первый раз такое вижу.

Добавлено через 2 минуты
VM стартует, но Raise не происходит...
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
11.04.2025, 16:48
Цитата Сообщение от proa33 Посмотреть сообщение
Посмотрите - там разные точки входа.
Для валидации надо явно указать Name.
если в конструкторе класса последней сторой записать:
Name = _model.Name;
то все работает правильно.
Ну писал уже простую очевидную вещь - там РАЗНЫЕ сущности проходят валидацию!!!!!!
Валидацию проходит свойство Name а не ваша модель и проходит она только в одном месте -в Name.set.
Еще раз крупными буквами: ЧТОБ СРАБОТАЛА ВАЛИДАЦИЯ НУЖНО ВЫЗВАТЬ SETTER СВОЙСТВА NAME.
Если валидируется Name, то ему и надо передать значение из модели - В КОСТРУКТОРЕ.
Напишите последней строкой в конструкторе

Name=_model.Name;

Дальше все это надо выбросить и переделать по нормальному.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2025, 16:48

Избежать одновременного выполнения LostFocus и команды кнопки MVVM
Помогите пожалуйста много об этом спрашивали, но ответа так и не нашла, может кто-то уже решил...

Кнопки в MVVM
Добрый день! У меня есть на View есть кнопка, которая должна просто открывать проводник. Код ее уже...

Не могу сделать отображение данных с кнопки и TextBox в MVVM
Не могу сделать отображение данных с помощью кнопки и TextBox. Только начал копаться в MVVM и хочу...

Добавление кнопки в форме с кнопки и смена фона новой кнопки
Хочу сделать так чтоб когда я запускал программу там было 2 кнопки, одна отвечала за создание новой...

Временное отключение валидации
&lt;asp:TextBox ID=&quot;FNBox&quot; runat=&quot;server&quot;&gt;&lt;/asp:TextBox&gt; &lt;asp:RequiredFieldValidator...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
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) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru