【问题标题】:WPF: ContextMenu in templated ListBox Item (InvalidCastException)WPF:模板化列表框项中的 ContextMenu (InvalidCastException)
【发布时间】:2019-12-03 22:39:58
【问题描述】:

我正在尝试将上下文菜单添加到 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 中的网格中,但它仅在您单击网格中的一个元素时才有效(有一些空白区域)(或者如果我向网格,但会覆盖/“覆盖”项目本身的样式,用于悬停和选定)

搜索时找不到类似的问题,也想不通Exception的逻辑..

【问题讨论】:

  • 能否请您发布 ItemTemplate 的代码?

标签: c# wpf xaml contextmenu


【解决方案1】:

您可以通过将ContextMenu 定义为资源来克服这个问题:

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

【讨论】:

  • 成功了!谢谢!关于为什么它不能以其他方式工作的任何想法(这是我发现的所有样本中的完成方式)?
【解决方案2】:

使用TargetType="ListBoxItem" 代码字符串。因为编码语言需要知道Listbox!

【讨论】:

  • 不确定你的意思!我正在使用`TargetType="ListBoxItem"‽
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多