В WPF вы можете настроить проверку на основе ошибок, возникающих на уровне данных во время привязки данных, с помощью клавиш ExceptionValidationRule
или DataErrorValidationRule
.
Предположим, у вас есть набор элементов управления, настроенных таким образом, и у вас есть кнопка «Сохранить». Когда пользователь нажимает кнопку «Сохранить», вам необходимо убедиться, что нет ошибок проверки, прежде чем продолжить сохранение. Если есть ошибки валидации, вы хотите кричать на них.
Как в WPF узнать, есть ли в каких-либо элементах управления привязкой данных ошибки проверки?
wpf
validation
data-binding
Кевин Берридж
источник
источник
IsValid
функцию? Я вижу, вы настроили команду,CanExecute
которая, как я полагаю, связана с командой кнопки «Сохранить». Будет ли это работать, если я не использую команды? И как кнопка связана с другими элементами управления, которые необходимо проверить? Я думал только о том, как использовать это, вызываяIsValid
каждый элемент управления, который необходимо проверить. Изменить: похоже, вы подтверждаете,sender
что я ожидаю, что это кнопка сохранения. Мне это кажется неправильным.Window
также является объектом зависимости. Я, вероятно, настраивает его с помощью какого-то обработчика событий наWindow
. В качестве альтернативы вы можете просто вызвать его напрямуюIsValid(this)
изWindow
класса.Следующий код (из книги «Программирование WPF» Криса Селла и Яна Гриффитса) проверяет все правила привязки для объекта зависимости и его дочерних элементов:
Вы можете вызвать это в обработчике события нажатия кнопки сохранения, например, на своей странице / в окне
источник
Опубликованный код не работал у меня при использовании ListBox. Переписал и теперь работает:
источник
Была та же проблема и попробовала предоставленные решения. Комбинация решений H-Man2 и skiba_k сработала для меня почти нормально, за одним исключением: в моем окне есть TabControl. И правила проверки оцениваются только для видимого в данный момент элемента TabItem. Поэтому я заменил VisualTreeHelper на LogicalTreeHelper. Теперь это работает.
источник
В дополнение к великолепной LINQ-реализации Dean, я получил удовольствие, заключив код в расширение для DependencyObjects:
Это делает его очень приятным, учитывая возможность повторного использования.
источник
Я бы предложил небольшую оптимизацию.
Если вы сделаете это много раз для одних и тех же элементов управления, вы можете добавить приведенный выше код, чтобы сохранить список элементов управления, которые действительно имеют правила проверки. Затем всякий раз, когда вам нужно проверить правильность, просматривайте только эти элементы управления, а не все визуальное дерево. Было бы намного лучше, если бы у вас было много таких элементов управления.
источник
Вот библиотека для проверки формы в WPF. Пакет Nuget здесь .
Образец:
Идея состоит в том, что мы определяем область проверки через присоединенное свойство, сообщающее ему, какие элементы управления вводом следует отслеживать. Тогда мы можем сделать:
источник
Вы можете рекурсивно перебирать все свое дерево элементов управления и проверять прикрепленное свойство Validation.HasErrorProperty, а затем сосредоточиться на первом из них, которое вы найдете в нем.
вы также можете использовать многие уже написанные решения, вы можете проверить эту ветку для примера и дополнительной информации
источник
Возможно, вас заинтересует пример приложения BookLibrary из WPF Application Framework (WAF) . В нем показано, как использовать проверку в WPF и как управлять кнопкой «Сохранить» при наличии ошибок проверки.
источник
В форме ответа aogan вместо явной итерации правил проверки лучше просто вызвать
expression.UpdateSource():
источник