本文参考自如下链接:
WPF的ContextMenu的绑定方式
WPF中listview控件绑定右键菜单命令
ContextMenu为何不能正常绑定
在WPF中,ContextMenu和ToolTip一样都是弹出层,与VisualTree已经分离了,只不过ToolTip在WPF中有进行特殊处理,所以可以正常绑定。
我的代码,在ListView中右键菜单中添加清空按钮,实现清空功能:
<ListView x:Name="LbLog" ItemsSource="{Binding LbLogItems}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding AssembledMsgListViewItemCopyCommand}"
CommandParameter="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
FontFamily="微软雅黑"
FontWeight="UltraBold"
Header="复制报文" />
<MenuItem
Command="{Binding LogAssembledMsgClearCommand}"
FontFamily="微软雅黑"
FontWeight="UltraBold"
Header="清空列表" />
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Margin" Value="0,5,0,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border
x:Name="border"
Background="White"
BorderBrush="#D291BC"
BorderThickness="0"
CornerRadius="10">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderThickness" Value="3" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<materialDesign:TransitioningContent OpeningEffect="{materialDesign:TransitionEffect Kind=SlideInFromRight}">
<Grid Height="35">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="5,0,0,0"
VerticalAlignment="Center"
FontSize="16"
FontWeight="UltraBold"
Text="{Binding TimeStamp}" />
<materialDesign:PackIcon
Grid.Column="1"
Width="24"
Height="24"
Margin="5,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
HorizontalContentAlignment="Center"
Foreground="{Binding ForeColor}"
Kind="{Binding IconKind}" />
<TextBlock
Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="16"
FontWeight="UltraBold"
Foreground="{Binding ForeColor}"
Text="{Binding Type}" />
<TextBlock
Grid.Column="3"
Margin="5,0,5,0"
VerticalAlignment="Center"
FontSize="16"
FontWeight="UltraBold"
IsHitTestVisible="False"
Text="{Binding Msg}" />
</Grid>
</materialDesign:TransitioningContent>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
下面一行代码是重点,可以将右键所选中的Item传递到ContextMenu中:
CommandParameter="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource AncestorType=ContextMenu}}"