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 :

Détecter clic droit sur le header commun (lignes & colonnes) d'un datagrid


Sujet :

Windows Presentation Foundation

  1. #1
    Invité
    Invité(e)
    Par défaut Détecter clic droit sur le header commun (lignes & colonnes) d'un datagrid
    Bonjour,

    Je réalise une grille en utilisant la classe DataGrid.

    Je souhaite détecter l'évènement clic droit sur le header de cette DataGrid.
    Mais pas n'importe quel header : celui qui est commun aux headers de lignes et de colonnes, celui en tout en haut à gauche.
    D'ailleurs, quand on clique dessus cela sélectionne toutes les lignes de la grille par défaut.

    Ce que je cherche à réaliser c'est ça :


    Pour l'instant je détecte le clic droit sur cet élément de la manière suivante :
    1. Je capte l'évènement clic de la grille entière
    2. J'obtient l'élément associé à la position du clic
    3. Je vérifie si cet élément est de type Rectangle
    4. Et là la partie facile est de définir un ContextMenu à cet élément


    Cependant il ne semble pas que cela soit une manière propre de le faire : par exemple si je clique sur le petit triangle qui se trouve dans cet élément, le menu ne s'affiche pas parce que l'élément est de type Polygon et non pas Rectangle.

    Comment récupérer l'élément qui contient tout ça ?

    Merci bien

  2. #2
    Invité
    Invité(e)
    Par défaut
    Un moyen un peu plus proche mais qui se rapproche du code que t'as mis en place dans ton précédent post

    Si j'étais toi je ne ferais pas de vérification sur le type de l'élément mais ferais comme suit :

    • Je renseigne la propriété Tag pour toutes les colonnes personnalisables ID, Nom, Prenom etc....
    • Dans le gestionnaire de l'évènement Click tu vérifies si la propriété Tag est renseigné ou pas. Si non alors il s'agit de ta colonne avec la fameuse petite flèche et du coup t'affiches ton menu contextuel ;-)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hmm... j'ai essayé cependant que dois-je récupérer comme élément pour vérifier le Tag et ajouter le ContextMenu ?
    J'ai essayé de récupérer une DataGridColumn mais elle ne possède pas la propriété ContextMenu...

    En plus, je pense que l'on ne peut que récupérer l'objet que sous forme de Rectangle par la méthode de positionnement que j'utilise...

    Ce qu'il faudrait c'est connaître la classe qui est derrière tout ça. Je veux dire celle qui crée ce carré. Elle doit bien être définie quelque part quand même...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Me revoilà, et je reviens avec la méthode propre.

    Il existe une propriété dans la DataGrid qui permet de faire cela.

    Voilà comment définir très simplement un menu contextuel en XAML :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <toolkit:DataGrid.ColumnHeaderStyle>
            <Style TargetType="toolkit:DataGridColumnHeader">
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="Item1"/>
                            <MenuItem Header="Item2"/>
                            <MenuItem Header="Item3"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </toolkit:DataGrid.ColumnHeaderStyle>

    Cela fera apparaître un menu contextuel au clic droit de la souris sur une en-tête de colonne. Rien de plus à faire, la gestion du clic droit existe par défaut.

    Voilà, maintenant, j'aimerai quand même définir dynamiquement les items de ce menu contextuel.
    J'aimerai donc pouvoir créer un Binding entre celui-ci et une propriété de mon code-behind C#.
    J'ai essayé de cette manière, sans succès :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ContextMenu ItemsSource="{Binding Path=AdvancedGrid.menu}">
                            <MenuItem Header="plop"/>
                        </ContextMenu>

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public List<BaseControls.MenuItem> menu { get; set; }
    menu = new List<BaseControls.MenuItem>();
                menu.Add(new BaseControls.MenuItem() { Header = "test" });

    Quelqu'un peut-il me donner la méthode pour créer ce type de binding ?

    Merci d'avance ! =D

  5. #5
    Invité
    Invité(e)
    Par défaut
    Initialement tu parlais d'afficher le menu contextuel à partir de la petite flèche située tout à gauche du Header mais pas à partir du Header tout entier. D'où ma réponse dans mon premier post.

    Si c'est pour afficher juste un menu pour le Header tout entier c'est vrai que c'est simple avec l'extrait de code que t'as fourni précédemment.

    Pour pouvoir utilser le binding souhaité le plus simple c'est de te créer une classe CustomMenuItem avec les propriété Visible et Title. Tu te crées une collection de classes dans le code-behind et tu la bindes à la propriété ItemsSource de ton ContextMenu.
    Pour tout marche il faudra que tu définisses un ItemTemplate le ContextMenu.
    En résumé tu dois avoir çà :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <ContextMenu ItemsSource="{Binding maCollectionMenuItems}">
    	<ContextMenu.ItemTemplate>
    		<DataTemplate>
    			<MenuItem IsChecked="{Binding Visible, Mode=TwoWay}" Header="{Binding Header, Mode=OneTime}"/>
    		</DataTemplate>
    	</ContextMenu.ItemTemplate>
    </ContextMenu>

  6. #6
    Invité
    Invité(e)
    Par défaut
    L'idée d'ajouter des propriétés Visible et Header n'est pas bête du tout.
    De plus, je sais maintenant comment créer un binding proprement, puisque je suis en train d'appliquer le pattern MVVM.

    Merci de ton partage, je teste ça dès que possible !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai créé une propriété dans mon ViewModel qui est une liste de MenuItem et que je binde à la propriété ItemsSource du ContextMenu de mes headers de colonne.

    Cependant comme ce ContextMenu est dans un Style, le binding ne fonctionne pas. -__-"
    J'en ai marre, j'ai le même problème avec tout ce qui est dans un style ou un template.

    J'ai essayé ta méthode, j'ai fait comme ça :

    Code XML : 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
    <toolkit:DataGrid.ColumnHeaderStyle>
                    <Style TargetType="toolkit:DataGridColumnHeader">
                        <Setter Property="ToolTip" Value="{Binding Path=ColumnHeadersTooltip, Mode=OneWay}" />
                        <Setter Property="ContextMenu">
                            <Setter.Value>
                                <ContextMenu ItemsSource="{Binding Path=ColumnsMenuItems,Mode=TwoWay}">
                                    <ContextMenu.ItemTemplate>
                                        <DataTemplate>
                                            <MenuItem IsChecked="true" />
                                        </DataTemplate>
                                    </ContextMenu.ItemTemplate>
                                </ContextMenu>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </toolkit:DataGrid.ColumnHeaderStyle>

    Sachant que la source fonctionne bien sur le menu de la DataGrid, qui lui n'est pas contenu dans un style.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bizarre que le binding ne fonctionne pas dans les styles. Tu es sûr de toi ?
    Si tu peux passer par les DataTriggers là au moins ça prend en compte le binding.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je suis sûr de moi, du moins par la méthode que l'on utilise parce que la Tooltip définie plus haut ne fonctionne pas non plus.

    Et en plus, j'ai essayé de définir le menu contextuel de la DataGrid elle-même, donc sans passer par un style, avec la même source, et là ça marche.

    Je crois que j'utilisais des triggers avant de le faire en XAML. Je vais donc tenter comme ça. Merci bien !

Discussions similaires

  1. Clic droit sur un wxButton ?
    Par Eldered dans le forum wxWidgets
    Réponses: 3
    Dernier message: 13/07/2006, 14h22
  2. clic droit sur image
    Par iamhere dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/06/2006, 15h15
  3. [MFC] clic droit sur une listbox ?
    Par julien.nasser dans le forum MFC
    Réponses: 1
    Dernier message: 07/06/2006, 14h53
  4. Clic droit sur un TTabControl
    Par FredericB dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/04/2006, 19h53
  5. [C#] Clic droit sur un TreeView
    Par whilecoyote dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/03/2005, 15h03

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