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

Silverlight Discussion :

databinding d'un Icommand et rafraichissement


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut databinding d'un Icommand et rafraichissement
    bonjour,

    voilà j'ai fait une petite appli test en silverlight 3 avec mvvm light toolkit.

    côté xaml, voici ce que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Button cmd:ButtonBaseExtensions.Command="{Binding AjouterPersonnel}"  Content="Ajouter la personne" Height="25" HorizontalAlignment="Left" Margin="93,211,0,0" VerticalAlignment="Top" Width="166" />
            <TextBox Text="{Binding PersonneSaisie.Num, Mode=TwoWay, UpdateSourceTrigger=Default}" x:Name="champsNum" Height="22" HorizontalAlignment="Left" Margin="93,43,0,0" VerticalAlignment="Top" Width="166"/>
            <TextBox Text="{Binding PersonneSaisie.Nom, Mode=TwoWay, UpdateSourceTrigger=Default}" x:Name="champsNom" Height="22" HorizontalAlignment="Left" Margin="93,74,0,0" VerticalAlignment="Top" Width="166"/>
            <TextBox Text="{Binding PersonneSaisie.Prenom, Mode=TwoWay, UpdateSourceTrigger=Default}" x:Name="champsPrenom" Height="22" HorizontalAlignment="Left" Margin="93,105,0,0" VerticalAlignment="Top" Width="166"/>
            <TextBox Text="{Binding PersonneSaisie.Mail, Mode=TwoWay, UpdateSourceTrigger=Default}" x:Name="champsMail" Height="22" HorizontalAlignment="Left" Margin="93,136,0,0" VerticalAlignment="Top" Width="166"/>
            <TextBox Text="{Binding PersonneSaisie.Fonction, Mode=TwoWay, UpdateSourceTrigger=Default}" x:Name="champsFonction" Height="22" HorizontalAlignment="Left" Margin="93,167,0,0" VerticalAlignment="Top" Width="166"/>
    j'ai donc un bouton bindé sur ma commande de sauvegarde d'un personne, et plusieurs champs de saisie num nom prénom mail fonction.

    côté view model, voici ce que j'ai:
    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
    20
    21
    22
    23
    24
    25
    #region PersonneAjoutee property
            public const string PersonneAjouteeName = "PersonneSaisie";
     
            private Personnel _personneSaisie = null;
     
            public Personnel PersonneSaisie
            {
                get
                {
                    return this._personneSaisie;
                }
     
                private set
                {
                    if (this._personneSaisie == value)
                    {
                        return;
                    }
     
                    this._personneSaisie = value;
     
                    RaisePropertyChanged(PersonneAjouteeName);
                }
            }
            #endregion
    j'ai mon objet de type "personnel" qui est instancié dans le constructeur de mon viewModel.. jusque là pas de pb.

    pour ma commande voici le code:
    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
    20
    21
    22
    23
    24
    25
    #region SaveCommand
            private void CommandeAjouterPersonnel()
            {
                AjouterPersonnel = new RelayCommand(ExecuteSaveCommand,CanExecuteSaveCommand);
            }
     
            public ICommand AjouterPersonnel { get; internal set; }
     
            public void ExecuteSaveCommand()
            {
                srvPersonnelClient.ajouterPersonnelAsync(PersonneSaisie.Num, PersonneSaisie.Nom, PersonneSaisie.Prenom, PersonneSaisie.Mail, PersonneSaisie.Fonction);
            }
     
            void srvPersonnelClient_ajouterPersonnelCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                ExecuterRafraichissement();
            }
     
            public bool CanExecuteSaveCommand()
            {
                if (this.PersonneSaisie == null || string.IsNullOrEmpty(this.PersonneSaisie.Num.ToString()) || string.IsNullOrEmpty(this.PersonneSaisie.Nom) || string.IsNullOrEmpty(this.PersonneSaisie.Prenom))
                    return false;
                return true;
            }
            #endregion
    les méthodes "AjouterPersonnelAsync" et "ExecuterRafraichissement" sont ok et testées.

    mon soucis est que quand je lance mon appli, mon bouton d'enregistrement est grisé, normal vu que les champs num, nom et prénom ne sont pas encore renseignés et qu'il sont la condition de mon CanExecuteSaveCommand.

    quand j'ai saisie le num, nom et prénom de la personne le champs ne se dégrise pas, comme si il ne savait pas en temps réel les changements effectués sur mes champs.

    comment faire cette manip ?

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En espérant ne pas répondre à côté, mais ça me semble être le même problème qu'ici :
    http://www.developpez.net/forums/d95...d/#post5375042

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    en effet ça à l'air d'être à peut prés le même problème, mais pas encore résolu non plus.. et puis réécrire un ICommand .. je pense qu'il devrait y avoir plus simple mais je ne sais pas quoi ..

    si quelqu'un a de bonnes pistes je suis preneur

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    je n'ai toujours pas trouvé la solution.. j'ai le même soucis avec un autre composant. sur clic d'un élément d'une datagrid, je veux affecter l'item choisi à un objet "itemChoisi"dans mon viewModel, et idem je ne passe jamais dans le setter..

    quelque chose doit m'échaper sur les évènements ... quelqu'un a déjà eu ce soucis ?

  5. #5
    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
    Par défaut
    Dans ton objet PersonneSaisie as tu aussi un RaisePropertyChanged pour chaque propriété ?

    En Silverlight la propriété UpdateSourceTrigger du binding ne peux que prendre les valeurs Default ou Explicit. Default signifie que le binding sera mis à jour lorsque la textbox aura perdue le focus. En WPF tu la valeur PropertyChanged en plus qui permet de mettre à jour le binding à chaque fois que le texte de la textbox change.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    voici le nouveau cas dont je viens de parler, mais qui revien au même que le ICommand (je pense).

    dans mon view model, j'ai ces éléments:
    * ma propriété:
    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
    20
    21
    22
    23
    public const string PersonneChoisiePropertyName = "PersonneChoisie";
     
            private Personne _personneChoisie = null;
     
            public Personne PersonneChoisie
            {
                get
                {
                    return this._personneChoisie;
                }
     
                private set
                {
                    if (this._personneChoisie == value)
                    {
                        return;
                    }
     
                    this._personneChoisie = value;
     
                    RaisePropertyChanged(PersonneChoisiePropertyName);
                }
            }
    l'objet Personne est défini comme ceci:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public class Personne : INotifyPropertyChanged
        {
            private int _numero;
            private string _nom;
            private string _prenom;
     
            public int numero
            {
                get { return _numero; }
                set
                {
                    _numero = value;
                    OnPropertyChanged("numero");
                }
            }
     
            public string nom
            {
                get { return _nom; }
                set
                {
                    _nom = value;
                    OnPropertyChanged("nom");
                }
            }
     
            public string prenom
            {
                get { return _prenom; }
                set
                {
                    _prenom = value;
                    OnPropertyChanged("prenom");
                }
            }
     
            #region INotifyPropertyChanged Members
     
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
            #endregion
    à la création de mon viewModel, j'instancie mon objet "personneSaisie", j'ai également marqué le setter et j'y passe bien au chargement de la page.

    côté xaml maintenant, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <data:DataGrid SelectedItem="{Binding Path=PersonneChoisie, Mode=TwoWay, UpdateSourceTrigger=Default}" ItemsSource="{Binding ListePersonnesTrouvees, Mode=TwoWay}" Margin="8,34,8,8"/>
    là j'ai bien ma liste de personnes qui se rempli quand j'appel un icommand qui fait cette manip.

    j'ai maintenant mis deux textbox a coté de cette liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TextBox Text="{Binding PersonneChoisie.numero, Mode=TwoWay}" />
    <TextBox Text="{Binding PersonneChoisie.nom, Mode=TwoWay}" />
    voilà tout. en fait côté viewModel si je fait un changement de propriété, comme par exemple le chargement de ma liste de personne, la vue est bien mise à jour. par contre, quand c'est à la vue de faire un rafraichissement ça ne marche pas .. comme si mon binding de mon selectedItem ne voulait pas setter ma personne dans "PersonneChoisie"... je ne comprend pas trop la logique .. as tu une idée?

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

Discussions similaires

  1. Databinding rafraichissement labels
    Par nemo67 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/05/2013, 12h47
  2. [VB.NET][DataBinding] Rafraichissement DataGrid lié à un obj
    Par speedy1496 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/10/2004, 10h15
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  4. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h15
  5. Timage rafraichissment
    Par Rizzla dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/09/2002, 17h08

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