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

C# Discussion :

Problème avec un binding sur un ContextMenu


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut Problème avec un binding sur un ContextMenu
    Bonjour,

    J'ai essayé de binder un menu contextuel avec une collection dont voici le code XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ListView.ContextMenu>
                    <ContextMenu Name="contextMenuMediaFromPlaylist" >
                        <MenuItem Header="ajouter à la playlist..." ItemsSource="{Binding listePlaylists}" Click="MenuItem_Click" />
                    </ContextMenu>
                </ListView.ContextMenu>
    Ma "listePlaylists" est une collection de string, et j'ai besoin de récupérer le MenuItem sur lequel j'ai cliqué (en fait j'ai besoin de récupérer la valeur du header bindé sur ma "listePlaylists" qui a été cliqué) pour effectué le traitement dans ma méthode MenuItem_Click().

    Quelqu'un saurait-il comment récupérer cette valeur ?

    Merci d'avance !

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    J'ai pas très bien compris la question mais je pense que tu devrais trouver ton bonheur dans les arguments de la callback
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Les arguments de la callback ?

    Je vais expliciter un peu mon problème :

    Ma collection de string à l'heure actuelle contient les valeurs suivantes : "Bibliothèque", "Funk", "Rock".

    et mon menu contextuel affiche donc :

    "ajouter à la playlist..." --> "Bibliothèque"
    --> "Funk"
    --> "Rock"

    Comment savoir si j'ai cliqué sur Rock, sur Funk ou sur Disco étant donné mon code XAML ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ListView.ContextMenu>
                    <ContextMenu Name="contextMenuMediaFromPlaylist" >
                        <MenuItem Header="ajouter à la playlist..." ItemsSource="{Binding listePlaylists}" Click="MenuItem_Click" />
                    </ContextMenu>
                </ListView.ContextMenu>
    Sachant que dans mon xaml.cs j'ai donc la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private void MenuItem_Click(object sender, RoutedEventArgs e) {
     
    }
    J'ai fouillé un peu dans le sender que j'ai casté en MenuItem et dans la variable e mais je n'ai rien trouvé d'accessible.

    Une idée sur où le trouver ?

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Je n'avais pas bien compris. Dans ce cas, tu peux directement piocher dans le listPlaylists.SelectItem
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Non je ne peux pas car cette liste est déjà bindé sur une listview et un élément est déjà sélectionné donc il me met cet élément mais je viens de me rendre compte que je pourrais passer par une liste intermédiaire mais n'y a-t-il pas moyen de faire autrement ?

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est pas celui qui est dans le parametre "sender"?

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    J'ai cherché dans le paramètre sender mais je n'ai pas trouvé ! Il y a tellement de paramètres... En fait je l'ai trouvé en mettant un espion mais l'accès était privé donc aucun moyen de le récupérer...

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Je suis un peu pommé là ... Si tu as une listbox et que tu veux l'item sélectionné, soit tu passes par SelectedItem, soit tu bind SelectedItem à une propriété qui se mettra à jour automatiquement.

    Si ça ne te convient pas, va falloir que tu expliques un peu plus clairement ce que tu as et ce que tu cherches ;p
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    J'ai un MenuItem bindé sur une ObservableCollection<string>. Donc listPlaylists est une ObservableCollection, pas une listView !

    Donc si j'ai "toto", "tata" et "titi" dans ma listPlaylists, mon menu contextuel comportera 3 MenuItem s'appelant "toto" tata et "titi" également.

    Tous les 3 appellent la même méthode lorsque je clic dessus, et je souhaite récupérer dans ma méthode le nom du MenuItem sur lequel j'ai cliqué !

    De plus, chose peut-être utile, j'ai 2 composants bindés sur cette liste :

    - Mon menu contextuel
    - Une listview différente de celle dans laquelle mon menu contextuel apparaït

    Une idée sur comment faire ?

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Dans ce cas là, pourquoi tu ne mets pas une composant genre listbox dans ton MenuItem, au lieu de binder directement dessus ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Parce que je ne savais pas que je pouvais intégrer une listbox à un MenuItem (et je n'ai encore jamais utilisé les listbox, je me suis mis à C# récemment).

    Tu n'aurais pas un petit bout de code en exemple ?

    Je suppose que par la suite je devrais chercher listbox.SelectedItem ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    T'as essayé de caster ton sender en MenuItem dans le callback?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void MenuItem_Click(object sender, RoutedEventArgs e) 
    {
     
       MessageBox.show(((MenuItem)sender).SelectedItem.Name  );
     
    }

  13. #13
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    J'ai jamais essayé non plus, je donne juste des pistes de reflexions.

    Après un tour sur la msdn j'ai vu que MenuItem avait une propriété ItemsSource mais pas de propriété SelectedItem (Bizarre :/). Essaye avec la listbox et vois ce que ça donne.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Je viens d'essayer avec la listBox et ce n'est vraiment pas génial... C'est faisable mais question esthétique c'est ZERO !

    Voici deux screenshots : le premier est celui correspondant à l'application que je souhaite faire, le deuxième correspond à ce que je vois dans l'espion...

    Ce qui est encadré en rouge dans l'espion c'est ce que je souhaite récupérer mais j'ai l'impression que cela n'est pas possible... Si quelqu'un a une idée...
    D'ailleurs, au passage petite question, à quoi correspond la "base" dans un objet ?
    Images attachées Images attachées   

  15. #15
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    BINGO !!!

    Je viens de trouver !!!

    il faut caster l'objet e.OriginalSource en System.Windows.Controls.HeaderedItemsControl ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (e.OriginalSource as System.Windows.Controls.HeaderedItemsControl).Header.ToString()
    En fait ce que je n'avais pas compris, car je pensais que les petits boutons bleus sur l'espion signifiaient que c'était privé par rapport à l'objet car en faisant e.OriginalSource, VS ne me proposait que les méthodes de base relatives à la classe Object soit : Equals, GetHashCode, GetType et ToString ! Mais en le castant donc j'ai pu y avoir accès !

    Merci quand même de t'être penché sur la question !

  16. #16
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    La base correspond à l'objet parent de ton objet.

    Imaginons que tu instancies une classe Homme qui hérite de Humain qui elle même hérite de EtreVivant.

    Dans ton espion tu verras :

    Homme:
    base
    AvoirBarbe
    EtreMusclé
    Si tu cliques sur base, tu vas voir les propriétés de ta classe parent, cad Humain :

    Humain:
    base
    TailleCheveux
    Et si tu cliques encore sur base, tu verras les propriétés de la classe parent, cad EtreVivant :

    EtreVivant:
    Respire
    Tu remarqueras que EtreVivant n'a pas de base, vu qu'il n'hérite de rien. Par contre, l'objet que tu as dans ton watcher est le menu item sur lequel tu as cliqué ! Le Header étant le nom qui apparait à l'écran.

    Donc ton object sender casté en MenuItem est bien ce que tu cherches !
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  17. #17
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Merci pour toutes ces précisions ^^

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

Discussions similaires

  1. [CSS] probléme avec a:hover sur IE (mais bon sous FF)
    Par lafouin dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 12/02/2009, 15h55
  2. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  3. Problème avec ma connexion sur hotmail
    Par shukin dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 30/01/2006, 14h09
  4. Problème avec port Série sur Win XP
    Par alexorel dans le forum MFC
    Réponses: 9
    Dernier message: 27/10/2005, 15h32

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