C# WPF ListboxItem和ContextMenu
我有这样的代码:C# WPF ListboxItem和ContextMenu,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有这样的代码: <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical" ContextMenuService.ShowOnDisabled="True"> <StackPanel.ContextMenu> <ContextMenu&
<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>
<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>
不幸的是,它不起作用。我的关联菜单已禁用(它正在显示,但我无法单击它,因为它已禁用)。我读到这个问题与选择问题有关,但我没有找到任何解决方案。你有什么想法吗 首先,奇怪的是,您试图设置命令和单击事件。你应该设置一个或另一个。该操作被禁用可能是因为您正在设置一个值为CanExecute=false的命令 您可以尝试为ListBoxItem设置ItemContainerStyle,而不是编写DataTemplate,如下所示:
<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>
<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>
在这里,我直接设置ListBoxItem实例的ContextMenu,这样它将在右侧控件上显示菜单。您只需将命令更改为header并处理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>
列表框已具有MenuContext。你可以试试
<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>
为什么要同时设置单击事件和菜单项的命令?您还希望为每个项目或列表显示此上下文菜单吗?这里是为整个列表设置的。您能更具体一点或给我更多关于您的解决方案的详细信息吗?@Ucodia:为什么要为整个列表设置?看起来它是在列表框内设置的。ItemTemplate?是的,对不起,我弄错了。我对您在StackPanel中布置ItemTemplate感到不安,因为ListBox已经在StackPanel中布置了项目。我将发布一个解决方案。我想为每个ListBoxItem显示上下文菜单(我想用鼠标右键单击ListBoxItem以显示菜单,然后选择操作,例如删除ListBoxItem),不幸的是,我在您的解决方案中遇到了此错误:{“无法将'System.Windows.Controls.MenuItem'类型的对象强制转换为'System.Windows.Controls.Button'。}那么也许您应该更准确地说明您正试图使用此列表执行的操作,因为这不应引发此类异常。我在参考资料中添加了上下文菜单,它正在工作: