C#: WPF中ListBox项的上下文菜单

6
我希望为我的WPF Listbox添加一个上下文菜单。我已经为整个Listbox添加了一个上下文菜单,但是即使您没有单击项目,也可以通过右键单击来获取上下文菜单。
我在谷歌上找到了一些内容,但这并没有奏效。
我尝试了类似于以下的内容:
<ListBox Margin="5" ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}">
                <TextBlock.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="{Binding Name}" Click="MenuItemName_Click"/>
                        <MenuItem Header="{Binding Capital}"  Click="MenuItemCapital_Click"/>
                        <MenuItem Header="{Binding Population}" Click="MenuItemPopulation_Click"/>
                    </ContextMenu>
                </TextBlock.ContextMenu>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我尝试了与示例中类似的文本块,以及其他教程中的其他元素,还尝试了没有任何元素的情况,但是都没有成功。我的列表框项没有上下文菜单 :(

后来我尝试了类似以下的方法:

 <ListBox.ItemTemplate>
     <DataTemplate>
         <ListBoxItem>
             <ListBoxItem.ContextMenu>
                 <ContextMenu>
                     <MenuItem/>
                 </ContextMenu>
             </ListBoxItem.ContextMenu>
         </ListBoxItem>
     </DataTemplate>
 </ListBox.ItemTemplate>

但是它也没有起作用。
有人能给我一个提示/有效的例子吗?
谢谢。

具体是什么出了问题?你需要更加明确一些... 你有在 VS 的输出窗口中检查绑定错误吗? - Thomas Levesque
1个回答

13

我会在ListBoxItem的样式中设置ContextMenu,而不是在DataTemplate中设置:

<ListBox Name="simpleListBox"
         ItemsSource="{Binding SimpleList}"
         DisplayMemberPath="Name">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        ...
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

@Thomas,我在菜单项中使用RelayCommand绑定了命令,但是这个RelayCommand从来没有被调用过。 - SubmarineX
@SubmarineX,你能在输出窗口中看到任何绑定错误吗?如果你看到类似“找不到控制FrameworkElement...”的东西,请查看此解决方案 - Thomas Levesque
@ThomasLevesque 谢谢您,我现在已经懂了。因为 ListBoxItem 的 DataContext 不是 ListBox 的 DataContext,所以我将命令绑定到 ListBoxItem 的 DataContext,然后通过 Messager 通知 ListBox 的 DataContext。之后我会看一下您的解决方案。 - SubmarineX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接