it-swarm-pt.tech

Práticas recomendadas de vinculação e validação de dados do WPF

Eu tenho um aplicativo WPF muito simples no qual estou usando a ligação de dados para permitir a edição de alguns objetos CLR personalizados. Agora estou querendo colocar alguma validação de entrada quando o usuário clicar em salvar. No entanto, todos os livros do WPF que eu li realmente não dedicam espaço a esse problema. Vejo que você pode criar ValidationRules personalizadas, mas estou imaginando se isso seria um exagero para minhas necessidades.

Portanto, minha pergunta é a seguinte: existe um bom aplicativo ou artigo de amostra em algum lugar que demonstre as práticas recomendadas para validar a entrada do usuário no WPF?

100
Mark Heath

Eu acho que a nova maneira preferida pode ser usar IDataErrorInfo

Leia mais aqui

83
rudigrobler

De MS's documentação de Patterns & Practices :

Validação de dados e relatório de erros

Seu modelo ou modelo de visualização será frequentemente solicitado para executar a validação de dados e para sinalizar quaisquer erros de validação de dados para a exibição, para que o usuário possa agir para corrigi-los.

O Silverlight e o WPF fornecem suporte para o gerenciamento de erros de validação de dados que ocorrem ao alterar propriedades individuais vinculadas a controles na exibição. Para propriedades únicas que são ligadas a dados a um controle, o modelo ou modelo de exibição pode sinalizar um erro de validação de dados dentro do setter de propriedade, rejeitando um valor inválido de entrada e lançando uma exceção. Se a propriedade ValidatesOnExceptions na ligação de dados for verdadeira, o mecanismo de vinculação de dados no WPF e no Silverlight manipulará a exceção e exibirá uma indicação visual para o usuário de que há um erro de validação de dados.

No entanto, lançar exceções com propriedades dessa maneira deve ser evitado sempre que possível. Uma abordagem alternativa é implementar as interfaces IDataErrorInfo ou INotifyDataErrorInfo em seu modelo de exibição ou classes de modelo. Essas interfaces permitem que seu modelo ou modelo de visualização execute a validação de dados para um ou mais valores de propriedade e retorne uma mensagem de erro à exibição para que o usuário possa ser notificado sobre o erro.

A documentação continua explicando como implementar IDataErrorInfo e INotifyDataErrorInfo.

23
Pat

pessoalmente, estou usando exceções para lidar com a validação. requer as seguintes etapas:

  1. na sua expressão de ligação de dados, você precisa adicionar "ValidatesOnException = True"
  2. em seu objeto de dados ao qual você está vinculando, você precisa adicionar o manipulador DependencyPropertyChanged para verificar se o novo valor atende às suas condições - se não - você restaura o valor antigo do objeto (se necessário) e lança uma exceção.
  3. no modelo de controle usado para exibir um valor inválido no controle, você pode acessar a coleção de erros e exibir a mensagem de exceção.

o truque aqui é vincular apenas aos objetos derivados do DependencyObject. implementação simples de INotifyPropertyChanged não funcionaria - há um bug na estrutura, que impede o acesso à coleta de erros.

10
Greg

Verifique também este artigo . Supostamente, a Microsoft lançou seu Biblioteca da empresa (v4.0) de seus padrões e práticas, onde eles cobrem o assunto da validação, mas Deus sabe por que eles não incluíram a validação para o WPF, então a postagem do blog que estou dirigindo você, explica o que o autor fez para adaptá-lo. Espero que isto ajude!

3
murki

Você pode estar interessado no aplicativo de exemplo BookLibrary do WPF Application Framework (WAF) = . Ele mostra como usar a validação no WPF e como controlar o botão Salvar quando existem erros de validação.

2
jbe

Se sua classe de negócios for usada diretamente pela sua interface do usuário, é preferível usar IDataErrorInfo, pois ela coloca a lógica mais próxima do proprietário.

Se sua classe de negócios for uma classe de stub criada por uma referência a um serviço WCF/XmlWeb, você não poderá/não deverá usar IDataErrorInfo nem lançar Exceção para uso com ExceptionValidationRule. Em vez disso você pode:

  • Use o ValidationRule personalizado.
  • Definir uma classe parcial no seu projeto de interface do usuário do WPF e implementa IDataErrorInfo.
0
Alex Pollan