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 :

[Binding] Comment opérer sur la propriété Validation.HasError d'un contrôle ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Points
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Points : 88
    Par défaut [Binding] Comment opérer sur la propriété Validation.HasError d'un contrôle ?
    Hello

    Dans ma fenêtre, j'ai un DatePicker et un bouton. La date saisie doit être un vendredi, si ce n'est pas le cas je déclenche une exception, ça fonctionne correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <dtp:DatePicker x:Name="dtpDate">
      <dtp:DatePicker.Value>
        <Binding Path="maDate">
          <Binding.ValidationRules>
            <ExceptionValidationRule />
          </Binding.ValidationRules>
        </Binding>
    </dtp:DatePicker.Value>


    Maintenant je voudrais également que lorsque la date n'est pas bonne, le bouton devienne désactivé. Dans la balise Style de mon bouton j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <DataTrigger Binding="{Binding ElementName=dtpDate, Path=IsValid}" Value="False">
      <Setter Property="IsEnabled" Value="False" />
    </DataTrigger>
    mais ça ne fonctionne pas. Que faut-il que je mette dans le Path de mon Binding ? J'ai essayé Validation.HasError mais ça ne fonctionne pas non plus. Je sais que je peux le faire en code behind de cette façon :

    dtpDate.GetValue(Validation.HasErrorProperty) (il me retourne bien "true" lorsque la validation a foiré) mais je préfère tout faire en XAML.

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Points
    3 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Par défaut
    Salut,

    Je suis peut-être complètement à côté, mais pourquoi mets-tu cela dans un DataTrigger plutôt que de binder directement à la propriété IsEnabled ?

  3. #3
    Membre régulier Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Points
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Points : 88
    Par défaut
    Salut Binoo

    Ce n'est pas à la propriété IsEnabled que je veux binder, mais à la propriété HasError.

    En gros si HasError est à true, je veux désactiver le bouton

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Points
    3 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Par défaut
    Je me suis pas fait comprendre je crois . En fait, j'aurai fait ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button x:Name="Btn" IsEnabled="{Binding ElementName=dtpDate, Path=IsValid}" />

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Points
    19 434
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Par défaut
    Citation Envoyé par binoo Voir le message
    Je me suis pas fait comprendre je crois . En fait, j'aurai fait ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button x:Name="Btn" IsEnabled="{Binding ElementName=dtpDate, Path=IsValid}" />
    J'aurais plutôt fait le binding sur la propriété HasError mais dans l'idée, je suis d'accord

  6. #6
    Membre régulier Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Points
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Points : 88
    Par défaut
    Le problème c'est que dtpDate.IsValid est à true même si la date sélectionnée n'est pas un vendredi. J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEnabled="{Binding ElementName=dtpDate, Path=Validation.HasError}"
    Puis ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEnabled="{Binding ElementName=dtpDate, Path=HasError}"
    mais ça ne passe pas non plus (NB : normalement c'est le contraire : IsEnabled est à true si HasError est à false mais c'était juste pour le test et j'ai testé les deux cas pour vérifier)

    En fait c'est quoi l'équivalent XAML de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtpDate.GetValue(Validation.HasErrorProperty)
    ?

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Points
    19 434
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Par défaut
    Citation Envoyé par annalady Voir le message
    Le problème c'est que dtpDate.IsValid est à true même si la date sélectionnée n'est pas un vendredi. J'ai essayé ça :

    IsEnabled="{Binding ElementName=dtpDate, Path=Validation.HasError}"
    Déjà, quelle est la valeur de Validation.HasError lorsqu'il y a des erreurs ?

  8. #8
    Membre régulier Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Points
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Points : 88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtpDate.GetValue(Validation.HasErrorProperty)
    retourne "true" quand il y a des erreurs. Donc ça fonctionne bien en code behind

    Validation.HasError je m'en sers dans les Triggers pour afficher le message d'erreur en ToolTip. Ca fonctionne bien aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Trigger Property="Validation.HasError" Value="true">
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0], Converter={StaticResource ErrorsToString}}" />
    </Trigger>

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Points
    19 434
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Par défaut
    A tout hasard, tu as essayé ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEnabled="{Binding ElementName=dtpDate, Path=Validation.HasError}"

    Mais avec un converter qui te renvoit la valeur inverse du booléen (si HasError vaut true, alors tu renvois false, etc.) ?

  10. #10
    Membre régulier Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Points
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Points : 88
    Par défaut
    Ah oui excuse j'avais pas compris ta question

    Lorsque je binde à la propriété Validation.HasError et que j'utilise un Converter, mon breakpoint dans la méthode Convert n'est jamais atteint.

    J'imagine que Validation.HasError ne fonctionne que quand tu l'appelle à partir du contrôle qui est "validé", pas à partir d'un autre contrôle (ce qui me semble logique vu que la classe DatePicker n'a pas de propriété Validation.HasError) Ce qui est louche c'est que IsValid retourne toujours true

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    1
    Points
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 1
    Points : 1
    Par défaut
    Une solution fonctionnelle de binding est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEnabled="{Binding ElementName=dtpDate, Path=(Validation.HasError), Mode=OneWay}"
    Mais il faut bien sûr mettre en oeuvre un convertisseur pour inverser le booléen comme le suggère Thomas

Discussions similaires

  1. [Binding] Comment binder 2 sources sur un seul Control ?
    Par adrienfehr dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 26/09/2008, 23h18
  2. [Binding] Comment dissocier la validation et la mise à jour de la source ?
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 22/09/2008, 02h49
  3. [Databinding] bind sur une propriété d'une collection
    Par herveb dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/12/2007, 11h35
  4. [WPF][Binding] Comment binder un fichier XML sur un treeview?
    Par bakonu dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 26/11/2007, 18h09
  5. Réponses: 15
    Dernier message: 04/11/2007, 18h43

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