radzio
radzio

Reputation: 2892

WPF ListboxItem and ContextMenu

I have code like this:

<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>

Unfortunately It doesn't work. My context menu is disabled (it is displaying but I cannot click it because it's disabled). I've read that this problem is related to selection problem but I didn't find any solution for that. Do you have any ideas?

Upvotes: 9

Views: 17630

Answers (3)

Ucodia
Ucodia

Reputation: 7700

You are trying to set Command and the Click event. You should set one or the other. Maybe the fact the action is disabled is because you are setting a Command with a value of CanExecute = false;

Instead of writing a DataTemplate, you can try to set the ItemContainerStyle for the ListBoxItem like this:

<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>

Here I directly set the ContextMenu of the ListBoxItem instance so it will display the menu on the right control.

Upvotes: 14

bravohex
bravohex

Reputation: 1034

ListBox already have a MenuContext. You can try it

 <ListBox  x:Name="MyistBox">                      
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Update"/>
                <MenuItem Header="Delete"/>
            </ContextMenu>
        </ListBox.ContextMenu>
    </ListBox>

Upvotes: 3

Spl2nky
Spl2nky

Reputation: 614

You just need to change command to header and handle DeleteEvent

 <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>

Upvotes: 0

Related Questions