如何在WPF ListView GridView中显示不同的ContextMenus?

时间:2009-09-08 11:22:10

标签: wpf gridview listview prism contextmenu

我有一个带有ListViewItems的ListView GridView,它代表不同类别的项目。我想为每个项目类别显示不同的ContextMenu。我希望使用DataTemplates做到这一点,但我正在努力。我的TreeView每个类别都有一个DataTemplate,我可以看到我如何为每个类别设置不同的ContextMenu,但我似乎无法获得类似的DataTemplates来为我的ListView工作。我吠叫错了树吗?

E.g。这是我对TreeView的DataTemplates之一:

<DataTemplate DataType="{x:Type viewModel:Cat1ViewModel}">
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Margin="3,0" 
               Source="..\Images\cat1.png"/>
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

我可以将我的ContextMenu添加到StackPanel(我希望),Bob是我的叔叔。

但GridView的内容看起来像这样:

<ListView.Resources>
    <DataTemplate x:Key="image">
        <Image Width="16" Height="16" Margin="-3,0,-3,0"
                          HorizontalAlignment="Center"
                          Source="{Binding Path=ObjectClass, 
                                           Converter={StaticResource imageConverter}}" />
    </DataTemplate>
</ListView.Resources>


<ListView.View>
    <GridView>
        <GridViewColumn Width="20"
                        CellTemplate="{StaticResource image}"/>
        <GridViewColumn Width="140" Header="Name"
                        DisplayMemberBinding="{Binding Path=Name}"
                        infrastructure:GridViewSort.PropertyName="Name"/>
        <GridViewColumn Width="140" Header="Type" 
                        DisplayMemberBinding="{Binding Path=Category}"
                        infrastructure:GridViewSort.PropertyName="Category"/>
        <GridViewColumn Width="400" Header="Description"
                        DisplayMemberBinding="{Binding Path=Description}"
                        infrastructure:GridViewSort.PropertyName="Description"/>
    </GridView>
</ListView.View>

DataTemplate资源中的此imageConverter显示listViewItem类别的相应图标。

我不知道从哪里开始。那么,首先,我想做的是什么?如果是的话,请你帮我一下。

此外:

目前,每个ListViewItem都由viewModel支持 - 所有类别都使用相同的viewModel类。

背景:

我想显示不同的ContextMenu而不是更改ContextMenu的原因是我正在使用Prism,而ContextMenus将由各种模块自动填充区域。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用ItemTemplateSelector执行此操作,而不是在ListView上设置ItemTemplate属性,使用ItemTemplateSelector属性。您必须创建自己的ItemTemplateSelector类实现并定义逻辑,以便它知道每个条件使用哪个模板,然后您只需要创建一组模板,您应该好好去!有关如何执行此操作的良好教程here