C# WPF:templated ListBox项中的ContextMenu(InvalidCastException)

C# WPF:templated ListBox项中的ContextMenu(InvalidCastException),c#,wpf,xaml,contextmenu,C#,Wpf,Xaml,Contextmenu,我正在尝试向ListBoxItem添加上下文菜单。我使用ListBox.ItemTemplate和DataTemplate(带有网格)来定义项的布局,并且ListBoxItem被设置为样式 在搜索中,这应该是一条路: <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="ContextMenu"> <S

我正在尝试向ListBoxItem添加上下文菜单。我使用ListBox.ItemTemplate和DataTemplate(带有网格)来定义项的布局,并且ListBoxItem被设置为样式

在搜索中,这应该是一条路:

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Header="Rename" Click="Rename_Click" />
                </ContextMenu>
            </Setter.Value>
        </Setter>
    </Style>
</ListBox.ItemContainerStyle>

但这会抛出一个
XamlParseException/InvalidCastException

无法强制转换类型为的对象
System.Windows.Controls.MenuItem到类型
System.Windows.Controls.Grid

我尝试将关联菜单添加到
ItemTemplate
中的网格中,但只有当您单击网格中的一个元素(有一些空白)时,关联菜单才起作用(或者如果我向网格中添加背景,但它会覆盖/覆盖项目本身的悬停和选定样式)


在搜索时,我找不到任何类似的问题,也找不出异常的逻辑。

您可以通过将
上下文菜单定义为资源来克服这一问题:

    <ListBox>
        <ListBox.Resources>
            <ContextMenu x:Key="cm">
                <MenuItem Header="Rename" Click="Rename_Click" />
            </ContextMenu>
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            ...
        </ListBox.ItemTemplate>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="ContextMenu" Value="{StaticResource cm}" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>

...

使用
TargetType=“ListBoxItem”
代码字符串。因为编码语言需要知道列表框

你可以发布ItemTemplate的代码吗?不知道你的意思!我使用的是'TargetType=“ListBoxItem”———这很有效!谢谢你知道为什么它没有以另一种方式工作吗(我发现的所有样本都是这样做的)?