我有一个列表视图,其中包含多个子项。我想在该列表视图中的右键单击项目上显示ContextMenu。
Actualy我有两个menuItems可以调用某些项目的命令,但我也想从viewModel调用命令。
以下示例是我对上下文菜单的定义。前两个MenuItems直接在ListViewItem上调用命令,第三个我试图从分配给用户控件的DataContext的ViewModel调用命令。
<ListView x:Name="snapshotList" ItemsSource="{Binding SnapshotList}" SelectedItem="{Binding ItemSelected}" Margin="10,81,10,27" MinHeight="100">
<ListView.ItemContainerStyle >
<Style TargetType="ListViewItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Copy path" Command="{Binding CopyPathCommand}"/>
<MenuItem Header="Copy path (cmd)" Command="{Binding CopyPathCommandToCmdCommand}"/>
<MenuItem Header="Test" Command="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource self}}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
我发现很多类似的问题,人们声称ContextMenu不是一般的,它不能直接访问viewModel / DataContext,并且必须通过Tag / Placement目标传递它。但是,当我尝试,我总是得到输出错误。那么如何将用户控件的dataContext / ViewModel传递给ContextMenu - &gt;菜单项?
**System.Windows.Data Error: 40 : BindingExpression path error: 'PlacementTarget' property not found on 'object' ''MenuItem' (Name='')'. BindingExpression:Path=PlacementTarget.DataContext; DataItem='MenuItem' (Name=''); target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')**
EDIT3: 好的,所以我想我找到了解决方案。我在遍历xmlTree时遇到了错误,如果我跟着@clemens提示我发现了这个
<ListView x:Name="snapshotList" ItemsSource="{Binding SnapshotList}" SelectedItem="{Binding ItemSelected}" Margin="10,81,10,27" MinHeight="100" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" >
<Setter Property="Tag" Value="{Binding DataContext, ElementName=userControl}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Copy path" Command="{Binding CopyPathCommand}"/>
<MenuItem Header="Copy path (cmd)" Command="{Binding CopyPathCommandToCmdCommand}"/>
<MenuItem Header="Test" Command="{Binding PlacementTarget.Tag.TestCommand, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
哪个有效,我以这种方式强调它: - 从MenuItem我无法访问ListView作为PlacementTarget和放置目标返回ListViewItem - 所以我将UserControl的DataContext绑定到ListView项的标签 - 然后在MenuItem中我得到relativeAncestor ContextMenu(我只能访问一个)然后拿走他的PlacementTarget(这是ListViewItem)并获取他的标签和调用命令