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 :

Page qui se valide => Annuler les automatismes d'un RelayCommand [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut Page qui se valide => Annuler les automatismes d'un RelayCommand
    Bonjour @ tous,

    Je me suis mis au MVVM en suivant ce tuto très bien fait: http://www.dotnetcurry.com/wpf/1037/...view-viewmodel
    Seulement, en voulant aller plus loin, je rencontre des cas de figures propres à ce pattern dont je ne maitrise pas encore les subtilités.

    Mon problème est que si je fait appel à execute() d'unRelayCommand et que mon add() ne se fait pas en BDD (email mal formé, ...), la page se rafraichit automatiquement et tous mes champs se retrouvent vide.
    J'aimerais maitriser cet aspect.

    Dans mon cas, j'ai des interfaces bindées aux viewmodel.
    Et admettons que je veuille ajouter un utilisateur par exemple. j'ai donc ce code behind:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public MvvmUserEdit() {
                InitializeComponent();
                this.DataContext = new ViewModelLocator().Main; //Liaison de l'interface au viewmodel
            }
     
            private void btnVal_Click(object sender, RoutedEventArgs e) { // Clic sur le bouton Valider
                var m = ((MainViewModel)this.DataContext);
                m.SaveCommand.Execute(m.EmpInfo); // Appel au viewModel
                if (string.IsNullOrEmpty(m.msgErr)) { // OK
                    Appelant.basculeMode();
                } else { // Il y a eu une erreur
                    MessageBox.Show(m.msgErr);
                }
            }
    Et dans mon viewmodel:
    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
    19
     
            public MainViewModel(IDataAccessService servPxy) {
                _serviceProxy = servPxy;
                EmpInfo = new tblUser();
                Employees = new ObservableCollection<tblUser>();
               ...
                SaveCommand = new RelayCommand<tblUser>(SaveEmployee);
                ...
                ReceiveEmployeeInfo();
                }
            void SaveEmployee(tblUser emp) {
                msgErr = string.Empty;
                    EmpInfo = _serviceProxy.Add(emp); // Ajout en BDD
                    if ((EmpInfo != null) && (EmpInfo.id != 0)) { // Ajout OK
                        Employees.Add(EmpInfo);
                        RaisePropertyChanged("EmpInfo");
                    } else // Ajout KO (dans mon cas, il passe par ici).
                        msgErr = tblUser.msgErr;
            }
    Dès que le MessageBox est passé, ma fenêtre se réinitialiser... Pire, si je rerenseigne les champs et que je revalide, il me fait une erreur d'instanciation.
    Bref, si je dois gérer manuellement les rechargements de pages et de champs, je ne voit plus l’intérêt du MVVM.

    Comment Annuler les effets du click (je suppose que c'est le INotifyPropertyChanged du tblUser qui déclenche tout ça).

    Merci d'avance.
    David.

  2. #2
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    C'est bon, j'ai trouvé.
    En fait, c'est moi même qui nullait l'objet tblUser. :-|
    Du coup, je passe par un objet temporaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    var empTmp = _serviceProxy.Add(emp);
                    if ((empTmp != null) && (empTmp.id != 0)) {
                        EmpInfo = empTmp;
                        Employees.Add(EmpInfo);
                        RaisePropertyChanged("EmpInfo");
                    } else
                        msgErr = tblUser.msgErr;
    De plus, pour le bouton "Annuler", j'ai trouvé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    EmpOri = (MainViewModel)this.MemberwiseClone(); // Pour faire du rollback.
     
            void Undo() {
                //if (leMode == Mode.New) {
                    this.EmpInfo.firstName = EmpOri.EmpInfo.firstName;
                    this.EmpInfo.lastName = EmpOri.EmpInfo.lastName;
                //}
            }
    C'est juste un peu dommage de devoir reparcourir toutes ses propriétés.
    David.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/05/2009, 13h45
  2. Réponses: 25
    Dernier message: 30/09/2007, 10h13
  3. CSS texte qui se répète sur toutes les pages
    Par drogba-11 dans le forum Mise en page CSS
    Réponses: 24
    Dernier message: 13/05/2007, 21h49
  4. Connaître les éléments d'une page qui VA être affichée
    Par NikoBe dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 09/11/2006, 14h57
  5. Réponses: 1
    Dernier message: 24/10/2006, 15h59

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