我有一个列表视图,显示项目集合,每个项目的基础数据都是视图模型(MVVM)。
我想要做的是当用户右键单击其中一个列表视图项时,在上下文菜单中显示不同的菜单项。显示的菜单项取决于所选项目的类型(即基础视图模型的类型)。
我希望下面的内容可以正常工作,但它没有(上下文菜单中没有显示任何项目)。
<ListView.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.SelectedItem, RelativeSource={RelativeSource Self}}">
<ContextMenu.Resources>
<DataTemplate DataType="{x:Type ViewModels:ViewModel1}">
<MenuItem Header="DoStuffForVM1" Command="{Binding DoStuffForVM1Command}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:ViewModel2}">
<MenuItem Header="DoStuffForVM2" Command="{Binding DoStuffForVM2Command}"/>
</DataTemplate>
</ContextMenu.Resources>
<ContentPresenter ContentSource="{Binding}" />
</ContextMenu>
</ListView.ContextMenu>
有什么想法吗?
感谢。
答案 0 :(得分:3)
这对我有用:
<ListView.ContextMenu>
<ContextMenu>
<ContentPresenter Content="{Binding Path=PlacementTarget.SelectedItem,
RelativeSource={RelativeSource AncestorType=ContextMenu}}" >
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type ViewModels:ViewModel1}">
<MenuItem Header="DoStuffForVM1" Command="{Binding DoStuffForVM1Command}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:ViewModel2}">
<MenuItem Header="DoStuffForVM2" Command="{Binding DoStuffForVM2Command}"/>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</ContextMenu>
</ListView.ContextMenu>
答案 1 :(得分:1)
这是因为您正在设置ListView的ContextMenu,因此您的DataContext是ListView的外部上下文,而不是单个列表项的ViewModel。
您需要设置每个项目的ContextMenu。例如,使用样式:
<ListView.Resources>
<ContextMenu x:Key="ItemContextMenu">
<MenuItem Header="DoStuffForVM1" Command="{Binding DataContext.DoStuffForVM1Command, RelativeSource={RelativeSource AncestorType={x:Type ListView}}"/>
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}"/>
</Style>
</ListView.ItemContainerStyle>
但是,上述内容并未考虑不同类型的菜单。
如果要为每种类型的列表视图定义数据模板,最简单的方法是在每个ContextMenu
中明确定义DataTemplate
。
如果没有,你将不得不在风格中使用触发器。您可能必须编写一个转换器才能触发对象类型。