在 ListViewItem 样式中为上下文菜单添加命令

Adding commands for Contextmenu inside ListViewItem Style

我正在为在 ListViewItem 样式下定义的 ContextMenu 命令寻找解决方案。当我在 ListView 中的 ContextMenu 中定义并绑定命令时,绑定成功。

我使用 viewModel class 文件来定义命令,例如:ExecuteClone、CanExecuteClone,我正在尝试使用命令绑定将其与 ContextMenu 菜单项绑定。

 <ListView.ContextMenu>
            <ContextMenu >
                <MenuItem Header="New" Command="{Binding AddCommand}" />
            </ContextMenu>
 </ListView.ContextMenu>

但是当我将 ContextMenu 从 ListView 更改为 ListViewItem 时,它没有触发 ViewModel 命令。

<ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="New" Command="{Binding AddCommand}"/>
                            <MenuItem Header="Clone" Command="{Binding CloneCommand}"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>

它需要点击 ViewModel AddCommand、CloneCommand,它们是 ViewModel class 下定义的 DelegateCommand 操作。

ListViewItems 与 ListView 具有不同的 DataContext。每个 ListViewItem 都将其 DataContext 设置为 ItemsSource 集合中的一项,因此这就是绑定不起作用的原因。如果你想将命令绑定到 ListView 的 DataContext,你可以这样做:

Command="{Binding DataContext.AddCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}"

我通过一些尝试找到了答案,无论如何感谢您的帮助。

<ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext}"/>
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="New" Command="{Binding AddCommand}"/>
                            <MenuItem Header="Clone" Command="{Binding CloneCommand}"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>