从上下文菜单中获取所选菜单项的名称(或索引),该菜单项是通过绑定到 ObservableCollection 的 ItemsSource 动态生成的
Get name(or index) of selected menu item from context menu, which was dynamically generated via ItemsSource bound to a ObservableCollection
我有一个包含 1 个菜单项的上下文菜单。该菜单项绑定到 itemssource 的 ObservableCollection。
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Example Menu Item"
Command="{Binding Path=DataContext.ExampleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"
ItemsSource="{Binding ObservableItems}">
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
如何获取所选菜单项的名称(或索引)。问题是我无法将命令绑定到每个单独的菜单项,因为它们是动态生成的。
例如,我如何知道点击了哪个项目,如下图所示?
非常感谢任何帮助。谢谢
对于动态生成的列表,您仍然可以为每个项目绑定 Command
和 CommandParameter
,但您需要使用 ItemContainerStyle
<ContextMenu>
<MenuItem Header="Example Menu Item" ItemsSource="{Binding ObservableItems}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Path=DataContext.ExampleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>
在此示例中 CommandParameter
,作为参数传递给您 ExampleCommand
命令,将成为您 collection 中的一个项目(当前 DataContext
of child项)
编辑
要获取索引,您可以使用一对 ItemsControl
属性:AlternationCount
和 AlternationIndex
。您将 AlternationCount
设置为 collection 中的项目数,并将 AlternationIndex
传递给您的命令
<MenuItem Header="Example Menu Item" ItemsSource="{Binding ObservableItems}" AlternationCount="{Binding ObservableItems.Count}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding ...}"/>
<Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
我有一个包含 1 个菜单项的上下文菜单。该菜单项绑定到 itemssource 的 ObservableCollection。
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Example Menu Item"
Command="{Binding Path=DataContext.ExampleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"
ItemsSource="{Binding ObservableItems}">
</MenuItem>
</ContextMenu>
</ListView.ContextMenu>
如何获取所选菜单项的名称(或索引)。问题是我无法将命令绑定到每个单独的菜单项,因为它们是动态生成的。
例如,我如何知道点击了哪个项目,如下图所示?
非常感谢任何帮助。谢谢
对于动态生成的列表,您仍然可以为每个项目绑定 Command
和 CommandParameter
,但您需要使用 ItemContainerStyle
<ContextMenu>
<MenuItem Header="Example Menu Item" ItemsSource="{Binding ObservableItems}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Path=DataContext.ExampleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>
在此示例中 CommandParameter
,作为参数传递给您 ExampleCommand
命令,将成为您 collection 中的一个项目(当前 DataContext
of child项)
编辑
要获取索引,您可以使用一对 ItemsControl
属性:AlternationCount
和 AlternationIndex
。您将 AlternationCount
设置为 collection 中的项目数,并将 AlternationIndex
传递给您的命令
<MenuItem Header="Example Menu Item" ItemsSource="{Binding ObservableItems}" AlternationCount="{Binding ObservableItems.Count}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding ...}"/>
<Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex)}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>