在 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>
我正在为在 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>