WPF ListboxItem and ContextMenu

牧云@^-^@ 提交于 2020-02-13 05:17:34

问题


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?


回答1:


Firstly, something strange is that 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.




回答2:


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>



回答3:


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>


来源:https://stackoverflow.com/questions/7554184/wpf-listboxitem-and-contextmenu

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!