在itemContainerStyle Setter中的ContextMenu MenuItem上绑定dataContext / viewModel

时间:2017-12-17 13:23:10

标签: c# wpf mvvm contextmenu

我有一个列表视图,其中包含多个子项。我想在该列表视图中的右键单击项目上显示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)并获取他的标签和调用命令

0 个答案:

没有答案