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 :

[MVVM] Validation sans code behind


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut [MVVM] Validation sans code behind
    Bonjour,

    Je met de la validation coté UI dans mon application WPF utilisant le patern MVVM.

    J'ai une série de contrôles qui dispose de ValidationRule et qui sont associé a un ValidationGroup.

    Pour l'instant je n'ai pas trouver de meilleur moyen que de lancer la validation de mes contrôles avec du code C# de l'évènement click de mon bouton de submit et remplir une propriété dans mon VM.

    Je procède de cette façon :

    VM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public bool HasError { get; set; }
     
    public GraphMarkViewModel()
    {
        SaveCommand = new RelayCommand(o => Save(), o => !HasError);
    }
    View :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var expressions = BindingGroup.BindingExpressions;
        expressions.ForEach(ex => ex.UpdateSource());
        (DataContext as GraphMarkViewModel).HasError = expressions.Any(ex => ex.HasError);
    }
    Quelqu'un a des idées pour améliorer cette architecture ? voir tout faire en XAML ? Je rêve peut être ?

    merci d'avance

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tout faire en XAML, tu pourras pas (à moins de créer ta propre MarkupExtension, etc... donc au final, tu écriras quand même du code )

    Sinon, là comme ca, je vois pas d'autres moyens...

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Ok merci !

    humm je crois que j'ai une idée ...

    Je fais un retour si ça vaut le coup

  4. #4
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Et pourquoi pas tout faire dans le VM ?...
    Avec une DP sur tonVM.HasError ?

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Mais tu la remplis comment cette DP ?

  6. #6
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    T'as pas moyen de faire de la notification sur les propriétés de ton VM qui sont sujettes à validation ?

    Je veux dire, dans l'idéal, ton VM ne devrait pas avoir besoin de ta vue xaml pour fonctionner.

    Donc quelque chose de ce style :
    Code c# : 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
    19
    20
    21
    22
    class ViewModel : DependencyObject, Iblablabla
    {
      propdp bool HasError
     
      public string BoundPropertyA{
        get{...}
        set{... Validate();}
      }
     
      void Validate(){
        ....
      }
     
      public ICommand SaveCommand{...}
     
      public ViewModel(){
        this.SaveCommand = new RelayCommand{
          CanExecuteDelegate = x=>this.HasError == false,
          ExecuteDelegate = x=> ...
        };
      }
    }

  7. #7
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Lui faire implémenter IDataErrorInfo ?

  8. #8
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    IDataErrorInfo, ça l'aiderait bien pour afficher l'erreur de chaque contrôle, individuellement. Mais ça l'aiderait pas trop pour griser le bouton sauver.

  9. #9
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Merci je vais regarder tout ca ...

    Pour le moment je suis sur un module de 15 jh a faire en 12j ... alors pour le affinage je vais voir après

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je suis aussi actuellement en train de travailler sur ce petit point.

    Personnellement, j'utilise la validation provenant de http://www.bennedik.de/2008_05_01_bennedik_archive.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <my:ErrorProvider x:Name="validMember" RulesetName="RuleSetA">
    <TextBox Margin="5"  Grid.Column="1" Grid.Row="0" Text="{Binding Path=CurrentItem.FirstName, Mode=TwoWay}" />
    </my:ErrorProvider>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            [StringLengthValidator(1, 50, Ruleset = "RuleSetA", MessageTemplate = "First Name must be between 1 and 50 characters")]
            public string FirstName{ get; set; }
    Mais pareil, je n'arrive pas à passer au ViewModel avec cette méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button  x:Name="buttonSave" Content=" Save "  Command="{Binding OnSave }"/>
    Pour ma méthode CanSave, j'ai besoin de pouvoir récupérer l'attribut : validMember.Validate(); (Disponible dans le code behind)

    Peut être que cela peut donner une idée pour ton coté (si tu travailles encore dessus, même si les 12j sont passés , moi je continue de chercher dans cette direction pour le moment.

    Je pensais peut être à un CommandParameter= "quelque chose comme validmember.Validate()" mais je ne sais pas encore comment cela marche

    Vlado

Discussions similaires

  1. MVVM View et code Behind
    Par Lionhart dans le forum C#
    Réponses: 2
    Dernier message: 29/06/2014, 23h13
  2. [MVVM] Fermer une fenêtre (sans code behind)
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 22/06/2011, 19h57
  3. Réponses: 1
    Dernier message: 21/01/2011, 10h17
  4. MVVM : Fermer une fenêtre enfant sans code-behind !
    Par GregLeOuf dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 11/12/2010, 13h16
  5. [MVVM] Abstrait sans code
    Par ikeas dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 05/10/2010, 09h20

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