3

アイテムのコレクションを表示するリストビューがあります。各アイテムには、基になるデータとしてビューモデル(MVVM)があります。

私がやりたいのは、ユーザーがこれらのリストビュー項目の1つを右クリックしたときに、コンテキストメニュー内にさまざまなメニュー項目を表示することです。表示されるメニュー項目は、選択した項目のタイプ(つまり、基になるビューモデルのタイプ)によって異なります。

以下は機能すると思いますが、機能しません(コンテキストメニューに項目が表示されません)。

<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は、個々のリストアイテムのViewModelではなく、ListViewの外部コンテキストであるためです。

代わりに、各アイテムのコンテキストメニューを設定する必要があります。たとえば、スタイルを使用します。

<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 に答える