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



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

我使用viewModel类文件来定义命令,例如: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类下定义的DelegateCommand操作。

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

<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>

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

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

最新更新