IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

désactiver la validation quand une textbox est vide


Sujet :

Windows Presentation Foundation

  1. #1
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut désactiver la validation quand une textbox est vide
    Bonjour

    J'ai lié une textbox en mode "OneWayToSource" à une propriété de type "int". Le problème est que par défaut, cette textbox est entourée d'un cadre rouge car la valeur initiale étant une string vide, elle ne peut pas être convertie dans le type de la propriété à laquelle elle est lié.

    Voici le code très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            <TextBox Text="{Binding Path=Age, Mode=OneWayToSource}" />
    Avec le framework 3.5, il n'y avait pas ce genre de validation automatique, mais depuis que je travaille avec le framework 4, j'ai cette validation qui m'ennuie..

    Cependant, j'aimerais par la suite afficher une alerte (de type cadre rouge), si l'utilisateur entre une valeur qui ne peut pas être convertie en Int (mais qui n'est pas une string vide), ou même créer ma propre ValidationRule.

    Même si je définie ma propre ValidationRule, et que je ne lève pas d'erreur quand Validate() reçoit une chaine vide, il reste toujours cette validation automatique. Est-il possible de la désactiver (au moins dans le cas d'une chaine vide)?

    Merci d'avance pour vos conseils.

  2. #2
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    Oui, je pense qu'en faisant ça, ce sera bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Person
        {
            public string Name { get; set; }
            public int? Age { get; set; }
        }
    Bon dév.

  3. #3
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    bien sûr.. mais je ne veux pas modifier ma classe modèle.

    Je me demande simplement pourquoi cette validation auto est apparue avec le framework 4 et comment la désactiver (tout en conservant éventuellement d'autres validations personnalisées que j'aurais crées par ailleurs) ?

    J'aurais aussi la possibilité d'utiliser un converter, mais c'est quand même un peu lourd.. n'y a t-il pas simplement un moyen de désactiver cette validation (attribut?) ou de la surcharger?

  4. #4
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    La solution de sisqo60 est la seule façon de faire, tu peux mettre un nullable dans ton modèle et mettre une règle de validation pour tester que la propriété Age n'a pas la valeur nulle.

  5. #5
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Citation Envoyé par chamamo Voir le message
    La solution de sisqo60 est la seule façon de faire
    C'est un programmeur qui parle.. ?

    Je pense qu'il y a plusieurs façons de faire.. je pourrais par exemple introduire un converter pour transformer un champ vide en 0. Ou bien je pourrais simplement introduire un ViewModel qui lui contient des champs nullable et se charge de cette conversion. Je suis sûr qu'on peut encore imaginer d'autres solutions et si vous avez des idées, n'hésitez pas à m'en faire part.

    Mais je trouve que ces méthodes sont frustrantes... car tout ceci n'était pas nécessaire avec le framework 3.5 et je me demande bien pourquoi cette validation automatique a été introduite dans le framework 4. Je peux comprendre son utilité, mais il me parait anormal qu'on ne puisse pas facilement la désactiver, surtout si on ajoute par dessus une autre ValidationRule personnalisée qui sera éventuellement redondante avec les vérifications faites automatiquement.

    En mode OneWayToSource, cette validation particulièrement gênante car on attend de l'utilisateur qu'il renseigne des champs pour enrichir les entités du modèle, mais par défaut et avant même qu'il n'ai pu saisir quoique ce soit, il recevra un cadre rouge et ne comprendra pas ce qu'il puisse s'agir d'une erreur de saisie.

    J'ai enfin cherché du côté des attributs 'ValidatesOnDataErrors' et 'ValidatesOnExceptions' mais ils ne semblent n'avoir aucun effet sur cette validation automatique..

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 95
    Par défaut
    Les VM sont faites pour ça, conserver l'intégrité de ton model et l'adapter à la vue. Je pense pas qu'il faille chercher plus loin que ça et je connais pas d'alternative moins gourmande sans toucher à tes objets métiers.

  7. #7
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    Citation Envoyé par maa Voir le message
    C'est un programmeur qui parle.. ?
    Je ne suis pas pas programmeur, plutôt developpeur.

    Citation Envoyé par maa Voir le message
    Je pense qu'il y a plusieurs façons de faire.. je pourrais par exemple introduire un converter pour transformer un champ vide en 0. Ou bien je pourrais simplement introduire un ViewModel qui lui contient des champs nullable et se charge de cette conversion. Je suis sûr qu'on peut encore imaginer d'autres solutions et si vous avez des idées, n'hésitez pas à m'en faire part.

    Mais je trouve que ces méthodes sont frustrantes... car tout ceci n'était pas nécessaire avec le framework 3.5 et je me demande bien pourquoi cette validation automatique a été introduite dans le framework 4. Je peux comprendre son utilité, mais il me parait anormal qu'on ne puisse pas facilement la désactiver, surtout si on ajoute par dessus une autre ValidationRule personnalisée qui sera éventuellement redondante avec les vérifications faites automatiquement.

    En mode OneWayToSource, cette validation particulièrement gênante car on attend de l'utilisateur qu'il renseigne des champs pour enrichir les entités du modèle, mais par défaut et avant même qu'il n'ai pu saisir quoique ce soit, il recevra un cadre rouge et ne comprendra pas ce qu'il puisse s'agir d'une erreur de saisie.

    J'ai enfin cherché du côté des attributs 'ValidatesOnDataErrors' et 'ValidatesOnExceptions' mais ils ne semblent n'avoir aucun effet sur cette validation automatique..
    Ce qui est frustrant c'est ton imagination débordante, faire un converter, validation ViewModel... pourquoi faire simple quand on peut faire compliqué hein?

    Peut importe l'outil de validation que tu utilises, tu peux spécifier si un champs doit être non nul, je ne vois pas en quoi ça te gène de mettre un int en nul et mettre une règle de validation, et un string ou la tu es obligé de le faire.

    J'avais déjà fait un framwork de validation sous CF avec mes propre attributs du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [Required]
    public int? Entier{get;set}
    Moi personnellement ça ne me choque pas.

  8. #8
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    ok merci. Mais comment fais-tu fonctionner ton attribut 'Required'?

    Sinon, j'ai trouvé cet article sur stackoverflow, qui traite d'un problème similaire.

    http://stackoverflow.com/questions/1...idation-in-wpf

    Il s'agit en gros d’implémenter l'interface IDataErrorInfo et de mettre l'attribut ValidatesOnDataErrors à true et retourner simplement null quand la valeur reçue est une chaine vide.

    Cependant, la validation par défaut du framework 4 semble ignorer la classe implémentant IDataErrorInfo quand elle lève une erreur. Pourquoi? Du coup l'index this[] sur IDataErrorInfo n'est appelé que quand il n'y pas d'erreur ce qui rend son usage inutile..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            <TextBox Width="100" Height="20" Text="{Binding Path=Age, Mode=OneWayToSource, ValidatesOnDataErrors=true}" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
        public class Person : IDataErrorInfo
        {
            public string Name { get; set; }
     
            public int Age { get; set; }
     
            public string Error
            {
                get { return null; }
            }
     
            //n'est appelé que lorsque la validation automatique ne lève pas d'erreur :((((
            public string this[string columnName]
            {
                get { return null; }
            }
        }

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour,
    Citation Envoyé par chamamo Voir le message
    pourquoi faire simple quand on peut faire compliqué hein?
    Je pense que maa a raison de ne pas changer son model comme ca. Car remplacer int par int? c'est ce qu'on appel un breaking change, ca veut dire que potentiellement toutes les librairy qui depandent du model vont devoir etre revu. On ne realisement ce genre de changement à la légère.

    Personnelement je pencherai pour un ViewModel, C'est vrai que ca fait peut-etre lourd pour une seule classe du model. Mais c'est la manière la plus propre que je connaisse.

  10. #10
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Bonjour,

    Je pense que maa a raison de ne pas changer son model comme ca. Car remplacer int par int? c'est ce qu'on appel un breaking change, ca veut dire que potentiellement toutes les librairy qui depandent du model vont devoir etre revu. On ne realisement ce genre de changement à la légère.

    Personnelement je pencherai pour un ViewModel, C'est vrai que ca fait peut-etre lourd pour une seule classe du model. Mais c'est la manière la plus propre que je connaisse.
    Merci pour ton conseil Antoine. Cela veut dire qu'il faut que je "relaie" toutes les propriétés de type numérique pour faire correspondre une valeur null à un 0?

    Personnellement, je suis plus tenté par le converter, comme expliqué dans ce billet:
    http://go4answers.webhost4life.com/E...-40-34962.aspx

    Sinon, il semble que ce problème soit bien connu des équipes de développement de Microsoft. Dommage qu'ils n'offrent pas un moyen simple de désactiver cette ConversionValidationRule, particulièrement inutile quand on a crée ses propres ValidationRules.

    http://social.msdn.microsoft.com/For...-291fbfad64e0/

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Citation Envoyé par maa Voir le message
    Merci pour ton conseil Antoine. Cela veut dire qu'il faut que je "relaie" toutes les propriétés de type numérique pour faire correspondre une valeur null à un 0?
    Si d'un point de vue IHM, remplir le champ est optionel, et que 0 correspond a la valeur par défaut, alors oui.

    Citation Envoyé par maa Voir le message
    Personnellement, je suis plus tenté par le converter, comme expliqué dans ce billet:
    http://go4answers.webhost4life.com/E...-40-34962.aspx
    Un converter peut etre une solution, c'est juste que du coup ton champ IHM ne sera jamais vide. Il y aura toujours la valeur par défaut dedans. Ce qui implique d'initialiser ton model, etc ...

    Apres pour le cas concret que tu exposes :
    On peut aussi prendre le probleme différement, l'age d'une personne est déterminer par rapport à ca date de naissance, ou de manière moins precise par rapport à son année de naissance.
    Du coup, sur ton IHM tu pourrais afficher une combox box avec les années, et selection par défaut l'année courrante. Ce qui initialiserai ton age à 0 par défaut.
    Mais cette logique est-elle valable pour ton application?

  12. #12
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Merci et désolé pour ma réponse tardive..

    Je vais décrire un peu mieux mon cas de figure:

    • J'ai plusieurs champs (textbox) dans lequel on peut rentrer des valeurs numériques (int, double, etc.).
    • Une fois ces valeurs renseignées, l'utilisateur peut appuyer sur un bouton qui permettra éventuellement de saisir de nouvelles données (ou bien de lancer quelques calculs sur les données saisies). Le bouton n'est actif que lorsque tous les champs sont renseignées et valides.
    • Pour l’utilisateur, il est déroutant d'avoir des champs initialisés à "0" alors qu'il n'a pas encore entré de données. Il est également déroutant qu'un champ vide soit encadré de rouge (considéré comme non valide) puisque seul l'activation du bouton suffit à indiquer qu'il doit renseigner tous les champs.
    • Certaines propriétés de mes objets ne doivent pas être nullable car elles sont indispensables à l’exécution de calculs et certaines classes existantes comptent sur le fait que ces propriété ne sont pas de type nullable.
    • Enfin, il est possible que les objets soient crées par une importation (bdd ou xml). Dans ce cas les valeurs sont remontés à l'interface utilisateur (bindingmode.twoways) et il est alors normal que certains 0 puissent apparaitre.


    Peut-être que par le biais de l'interface utilisateur, les objets ne devraient être crées et bindés aux contrôles qu'au moment du clique sur le bouton. Cela éviterai d'avoir des champs initiés avec la valeur '0'. Cependant la validation a besoin de travailler sur des propriété liées, or je voudrais qu'elle soit effective avant que l’utilisateur clique sur le bouton (vérification au moment de LostFocus)...

    Voilà.. je pense que le problème est en fait assez général.. car c'est souvent sous ce principe que mes applications fonctionnent. Cependant je n'y ai pas encore trouvé de solutions satisfaisantes..

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/04/2015, 16h06
  2. arreter une procédure quand une condition est validé
    Par levasseur62 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/04/2011, 19h37
  3. tester si le résultat d'une requete est vide
    Par monstour dans le forum ASP
    Réponses: 13
    Dernier message: 04/10/2006, 15h14
  4. Tester si une table est vide
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 01/07/2004, 17h25
  5. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo