No WPF, você pode configurar a validação com base nos erros lançados em sua camada de dados durante a vinculação de dados usando ExceptionValidationRule
ou DataErrorValidationRule
.
Suponha que você tenha vários controles configurados dessa forma e um botão Salvar. Quando o usuário clica no botão Salvar, você precisa se certificar de que não haja erros de validação antes de prosseguir com o salvamento. Se houver erros de validação, você deve gritar com eles.
No WPF, como você descobre se algum de seus controles Data Bound tem erros de validação configurados?
wpf
validation
data-binding
Kevin berridge
fonte
fonte
IsValid
função? Vejo que você configurou umCanExecute
que eu acho que está relacionado ao comando do botão Salvar. Isso funcionará se eu não estiver usando comandos? E como o botão se relaciona com os outros controles que precisam ser verificados? Meu único pensamento de como usar isso é chamarIsValid
cada controle que precisa ser validado. Edit: Parece que você está validando osender
que espero ser o botão Salvar. Isso não parece estar certo para mim.Window
também é um objeto de dependência. Ele provavelmente está configurando isso com algum tipo de manipulador de eventos noWindow
. Como alternativa, você pode ligar diretamenteIsValid(this)
para aWindow
classe.O código a seguir (do livro Programming WPF de Chris Sell & Ian Griffiths) valida todas as regras de vinculação em um objeto de dependência e seus filhos:
Você pode chamar isso em seu manipulador de eventos de clique do botão Salvar como este em sua página / janela
fonte
O código postado não funcionou para mim ao usar um ListBox. Eu reescrevi e agora funciona:
fonte
Tive o mesmo problema e tentei as soluções fornecidas. Uma combinação de soluções de H-Man2 e skiba_k funcionou quase bem para mim, para uma exceção: My Window has a TabControl. E as regras de validação só são avaliadas para o TabItem que está visível no momento. Então, substituí VisualTreeHelper por LogicalTreeHelper. Agora funciona.
fonte
Além da ótima implementação LINQ de Dean, me diverti agrupando o código em uma extensão para DependencyObjects:
Isso o torna extremamente bom, considerando a reutilização.
fonte
Eu ofereceria uma pequena otimização.
Se você fizer isso muitas vezes com os mesmos controles, poderá adicionar o código acima para manter uma lista de controles que realmente têm regras de validação. Então, sempre que você precisar verificar a validade, examine apenas esses controles, em vez de toda a árvore visual. Isso seria muito melhor se você tivesse muitos desses controles.
fonte
Aqui está uma biblioteca para validação de formulário no WPF. Pacote Nuget aqui .
Amostra:
A ideia é definir um escopo de validação por meio da propriedade anexada, informando quais controles de entrada rastrear. Então podemos fazer:
fonte
Você pode iterar em toda a sua árvore de controles recursivamente e verificar a propriedade anexada Validation.HasErrorProperty e, em seguida, focar no primeiro que encontrar nela.
você também pode usar muitas soluções já escritas você pode verificar este tópico para um exemplo e mais informações
fonte
Você pode estar interessado no aplicativo de amostra BookLibrary do WPF Application Framework (WAF) . Mostra como usar a validação no WPF e como controlar o botão Salvar quando houver erros de validação.
fonte
Na forma de resposta aogan, em vez de iterar explicitamente por meio de regras de validação, é melhor apenas invocar
expression.UpdateSource():
fonte