3

我有一个显示项目集合的列表视图,每个项目都有一个视图模型(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>

有任何想法吗?

谢谢。

4

2 回答 2

4

这对我有用:

<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>
于 2012-06-18T13:50:31.327 回答
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.

如果没有,您将不得不使用样式中的触发器来完成。您可能必须编写一个转换器才能触发对象类型。

于 2012-06-18T13:28:05.880 回答