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 :

[C#][VS 2008]Button Command


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut [C#][VS 2008]Button Command
    Bonjour,

    comme vous pouvez vous en douter mon problème concerne le propriété Command d'un contrôle Button.

    Pour développer mon appli je suis parti de ce tuto : http://japf.developpez.com/tutoriels...-et-testables/ très utile au niveau de la structure "idéal" pour une appli WPF. J'ai un usercontrol nommé indicateur, et dans mon dossier ViewModel une classe indicateurViewwModel, comme dans l'exemple du tuto.

    Dans indicateur.xaml, j'ai bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xmlns:ViewModel="clr-namespace:atDemo.ViewModel"
    <!-- ... -->
                <Button Style="{StaticResource Bouton}" Command="{Binding Maj}"  Height="21.96" VerticalAlignment="Bottom" Margin="128,0,120,-16">Button</Button>
    Donc mon usercontrol récupère bien les informations d'un objet en revanche lors du click sur le bouton rien ne se passe. Voici mon code dans ma classe indicateurViewModel:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ICommand Maj
            {
                get
                {
                    if (this.majCommand==null)
                        this.majCommand = new RelayCommand(() => this.SelectedServeur.Variation+=5);
     
                    return this.majCommand;
                }
            }

    Si je met un point d'arrêt au début de la fonction, je constate qu'il ne rentre jamais dedans. Pourtant dans ma fenetre principal j'ai bien :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Database db = new Database();
                indicateurViewModel c = new indicateurViewModel(db);
                listView1.DataContext = c;

    Pour info j'ai un listView qui va contenir plusieurs fois le même usercontrol. (car un indicateur - mon usercontrol- ne concerne qu'une instance)

    Si vous avez besoin de plus de code pas de soucis, je voulais pas tout mettre en bloc d'un coup, j'aimerais surtout savoir si quelqu'un avait djéà eu ce problème et dans ce cas m'orienter dans ma recherche de solution.

    Merci d'avance.

    EDIT: En debug voici le message :

    System.Windows.Data Error: 39 : BindingExpression path error: 'Maj' property not found on 'object' ''ServeurViewModel' (HashCode=63349250)'. BindingExpressionath=Maj; DataItem='ServeurViewModel' (HashCode=63349250); target element is 'Button' (Name='Button1'); target property is 'Command' (type 'ICommand')
    Ca veut dire que j'ai mal lié mon bouton ?... Puisqu'il devrait êter lié à indicateurViewModel et pas ServeurViewModel si j'ai bien compris. Ca vient peut être de la ? :

    Window1.xaml.cs

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (Control ctrl in listView1.Items) 
                {
                    if (ctrl.GetType() == typeof(Controler.indicateur))
                    {
                        ctrl.DataContext = c.Serveurs[j];
                    }
                    j++;
                }

    Donc la en gros je met en datacontext de mes usercontrol un objet serveur...

  2. #2
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    J'avance sur mon problème, maintenant il rentre bien dans la méthode mais j'ai le message d'erreur suivant :

    'CommandConverter' ne peut pas convertir 'atDemo.ViewModel.RelayCommand' en 'System.String'.
    Sachant que ma méthode est comme ça:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public ICommand Maj
            {
                get
                {
                    if (this.majCommand==null)
                        this.majCommand = new RelayCommand(this.Modif);
     
     
                    return this.majCommand;
                }
            }

    Et le void :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     private void Modif()
            {
     
                this.SelectedServeur.VariationHit += 5;
            }

    Any idea ?

    EDIT : Si j'implémente ce code dans la source du tutoriel cité plus haut, aucune erreur (même si rien ne se passe :s ) donc la j'avoue avoir du mal à comprendre...

  3. #3
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Bon je n'ai plus l'erreur mais rien ne se passe et pour cause dans ViewModelBase.cs lorsque je debug, jamais il ne rentre dans cette condition :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// <summary>
            /// Raises this object's PropertyChanged event.
            /// </summary>
            /// <param name="propertyName">The name of the property that has a new value.</param>
            protected virtual void OnPropertyChanged(string propertyName)
            {
                this.VerifyPropertyName(propertyName);
     
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    En gros propertyChanged vaut toujours null et j'avoue ne pas savoir pourquoi...

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Faudrait que tu montres un peu plus de code car là, y'en a partout et c'est difficilement compréhensible

  5. #5
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    C'est vrai c'est vrai, c'est un peu le foutoir je vais essayer de faire ça bien cette fois :

    Au départ comme dit plus haut je m'appuis sur le tuto MVVM, j'ai donc bien séparé le Model, le View et le ViewModel:

    Dans ma View j'ai un User Control nommé indicateur.xaml avec (entre autres) le bouton suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Name="Button1" Style="{StaticResource Bouton}" Command="{Binding Maj}"  Height="21.96" VerticalAlignment="Bottom" Margin="128,0,120,0">Button</Button>
    Dans mon ViewModel j'ai le code suivant indicateurViewModel.cs :

    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
     public ICommand Maj
            {
                get
                {
                    if (this.majCommand==null)
                        this.majCommand = new RelayCommand(this.Modif); 
                    return this.majCommand;
                }
            }
    //...
    private void Modif()
            {
                this.SelectedServeur.VariationHit += 5;
            }

    ensuite dans ServeurViewModel (car ma classe s'appel Serveur), j'ai le code suivant :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public double VariationHit
            {
                get { return this.serveur.VariationHit; }
                set { this.serveur.VariationHit = value; 
                    //le OnPropertyChanged se charge de faire le test à null
                    OnPropertyChanged("VariationHit"); }
            }

    Le problème étant que dans mon Windows1.xaml, je génère plusieurs fois ce User Control en fonction d'un fichier XML :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    List<ServeurViewModel> lstServeur = new List<ServeurViewModel>();
                int i = 1;
                //Méthode pour parser un XMl :
                //1- Charger le XML grace à la classe XElement implémenté dans System.Xml.Linq
                //2- Faire les requetes linq pour récuperer ce que l'on souhaite
                var xElem = XElement.Load(@"datas.xml");
                StackPanel g = new StackPanel();
                g.Orientation = System.Windows.Controls.Orientation.Horizontal;
     
                this.WindowState = System.Windows.WindowState.Maximized;
     
     
    foreach (var o in xElem.Descendants("_x0031_"))
                {
     
     
     
                    ServeurViewModel s = new ServeurViewModel(new Serveur { "blablabla ca fonctionne l'instanciation j'espargne les attributs"});
                    lstServeur.Add(s);
                    View.indicateur ind = new View.indicateur();
                    ind.Name = "test" + i;
                    ind.DataContext = s;
                    ind.Button1.DataContext = new indicateurViewModel("attribut1...");
                    if (j == 4)
                    {
                        g.Children.Add(ind);
                        listView1.Items.Add(g);
                        g = new StackPanel();
                        g.Orientation = System.Windows.Controls.Orientation.Horizontal;
                        j = 0;
                    }
                    else {
                        g.Children.Add(ind);
                    }
     
     
                    i++;
                    j++;
                }

    J'explique ensuite le comportement, bon déjà voici le rendu à l'écran, à chaque control j'ai donc mon petit bouton :



    Lorsque je clique dessus, si je met un point d'arrêt sur le OnPropertyChanged de mon Set, il arrive bien dessus, comme expliqué plus haut c'est PropertyChanged qui vaut toujours null.

    Merci de vous interesser à mon problème

  6. #6
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Hello,

    Quand tu créé ta commande si elle est null, n'oublie pas de d'appeler OnPropertyChanged("Maj") pour prévenir l'UI que ta commande a bien étée mise à jour...


    Tiens nous au courant si cela marche...

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

Discussions similaires

  1. parametre dans button command
    Par bender86 dans le forum Tkinter
    Réponses: 5
    Dernier message: 30/07/2011, 09h00
  2. [C#][asp.NET] Button Click et commande SQL
    Par patricklinden dans le forum ASP.NET
    Réponses: 1
    Dernier message: 21/12/2007, 04h38
  3. OLE commander par un command button
    Par drogba-11 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/07/2007, 21h24
  4. faire bouger 2 command button simultanement
    Par Namson dans le forum VB.NET
    Réponses: 6
    Dernier message: 23/05/2007, 09h43

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