7
votes

WPF ListboxItem et contextMenu

J'ai un code comme celui-ci:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Vertical" 
                    ContextMenuService.ShowOnDisabled="True">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Command="Delete" Click="DeleteEvent">      
                    </MenuItem>
                </ContextMenu>
            </StackPanel.ContextMenu>
                <TextBlock Text="{Binding EventName}">
            </TextBlock>        
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>


6 commentaires

Pourquoi essayez-vous de définir l'événement de clic et la commande du menuem en même temps? Voulez-vous également que ce contextMenu soit affiché pour chaque article ou pour la liste? Ici, il est défini pour toute la liste.


Pouvez-vous être plus précis ou me donner plus de détails sur votre solution?


@Ucodia: Pourquoi pour toute la liste? On dirait qu'il est défini dans la liste de liste.Itemplate?


Oui, désolé mon erreur. J'ai été dérangé par le fait que vous étiez étendu l'élémentTemplate dans un StackPanel car la liste de liste dépose déjà les éléments d'un StackPanel. Je vais poster une solution.


Je souhaite afficher le menu contextuel de chaque ListboxItem (je veux cliquer avec le bouton droit de la souris sur la liste ListboxItem pour afficher le menu d'affichage, puis sélectionnez Fonctionnement par exemple Supprimer la liste de ListboxItem)


Cela peut être dû à des hittesting. Définissez une couleur d'arrière-plan transparente sur votre StackPanel et le clic de la souris MIT ACCIT sur StackPanel, ce qui entraîne un menu contextuel visible.


3 Réponses :


10
votes

Premièrement, quelque chose d'étrange est que vous essayez de définir la commande et l'événement de clic. Vous devriez définir l'un ou l'autre. Peut-être que le fait que l'action est désactivée est que vous définissez une commande avec une valeur de Canexecute = false;

au lieu d'écrire un fichier de données, vous pouvez essayer de définir l'élémentContainerStyle pour la liste ListboxItem comme ceci: P>

<ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Delete" Click="DeleteEvent"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
            <Setter Property="Content" Value="{Binding Path=EventName}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>


3 commentaires

Malheureusement, j'ai reçu cette erreur avec votre solution: {"Impossible de lancer l'objet de type 'System.Windows.Controls.Menuitem' pour taper" System.windows.controls.button ".}


Ensuite, vous devriez peut-être être plus précis dans ce que vous essayez exactement de faire avec cette liste, car cela ne devrait pas jeter ce genre d'exception.


J'ai ajouté le menu contextuel aux ressources et ça marche: Stackoverflow.com/questions/4752273/...



0
votes

Il vous suffit de changer de commande en en-tête et de gérer Deleteeventer

 <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" 
                        ContextMenuService.ShowOnDisabled="True">
                <StackPanel.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Delete" Click="DeleteEvent">      
                        </MenuItem>
                    </ContextMenu>
                </StackPanel.ContextMenu>
                    <TextBlock Text="{Binding EventName}">
                </TextBlock>        
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>


0 commentaires

1
votes

Listbox a déjà un menucontext. Vous pouvez l'essayer xxx


0 commentaires