Kombinuję jak by tu sprawić, by ContextMenu pojawiało się pod lewym klikiem. Pod prawym też może być, a może nie być, bez różnicy - ważne, by pojawiło się pod lewym.
Nakreślmy kontekst: używam MVVM Light, jestem w CustomTaskPane, w którym wyświetla się ListView, którego Itemy to DataTemplate. Taki Item właśnie ma mieć ContextMenu. Item nie ma pliku cs z code behind, tylko odwołuje się do view-modelu TaskPane'a przez RelayCommands. Dlatego najchętniej skłaniam się ku rozwiązaniom, które można zaimplementować w xamlu.
Mniej więcej działa mi to:
<ToggleButton Name="OptionsButton"
Padding="0"
Margin="0"
Height="25"
Width="100"
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext}"
Style="{StaticResource DefaultToggleButton}"
ContextMenuService.Placement="Bottom"
ContextMenuService.PlacementTarget="{Binding ElementName=OptionsButton}"
ContextMenuService.ShowOnDisabled="True">
<ToggleButton.Resources>
<DiscreteObjectKeyFrame x:Key="optionsProxy" Value="{Binding ElementName=OptionsButton}"/>
</ToggleButton.Resources>
<ToggleButton.ContextMenu>
<ContextMenu IsOpen="{Binding Path=Value.IsChecked, Source={StaticResource optionsProxy}, Mode=TwoWay}">
Zachowanie na kliki jest OK. Niestety jednak nie wygląda to dobrze... Na lewy klik nie ładują się style, które mam w osobnym pliku. Jeśli kliknę prawym, to wygląda dobrze i następne kliknięcia lewym też już są OK, ale jeśli klikałabym tylko lewym, to mam domyślne style. Style są dodane o tak:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Resources/Styles/MenuStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
Drugi problem to pozycja menu. Jak widac, mam tu ustawiony ContextMenuService.PlacementTarget i ContextMenuService.Placement. Jeśli używam prawego klika, to menu ładnie usadawia się pod przyciskiem. Jeśli klikam lewym, to menu pojawia się w miejscu kliknięcia...