WPF:如何获取我调用上下文菜单的 ListView 元素的值
本文关键字:菜单 调用 上下文 ListView 元素 何获取 获取 WPF | 更新日期: 2023-09-27 18:35:49
我有"网格视图样式"的列表视图,有 2 列。我想知道如何获取我调用上下文菜单的项目的第一列值(CM 只有一个按钮,我想处理值)?
下面是 XAML:
<ListView.Resources>
<ContextMenu x:Key="ContextMenu">
<MenuItem Header="Run test with parameters" x:Name="runTestWithParams" Click="runTestWithParams_Click" />
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="ContextMenu" Value="{StaticResource ContextMenu}"/>
</Style>
</ListView.ItemContainerStyle>
这是上下文菜单按钮handeler:
private void runTestWithParams_Click(object sender, RoutedEventArgs e)
{
string valueOfFirstColumn = // something like ItemThatWasClicked["ID"].ToString();
}
如果你有任何想法,请帮助我。
找到的解决方案
有必要创建 RightMouseUp 事件的处理程序并从其发送者那里获取我需要的值,由于Context_Menu_button_Click的发件人不包含有关单击它的项目的信息,但包含有关上下文菜单的信息。所以。。。我是这样处理的:
处理器:
private void HandleMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
ListViewItem selected = sender as ListViewItem;
String valueINeed = (selected.Content as TestIdentification).Id;
}
XAML:
<Style TargetType="ListViewItem">
<EventSetter Event="MouseRightButtonUp" Handler="HandleMouseRightButtonUp" />
</Style>
谢谢大家!
另一种解决方案是处理 ListView 上的 ContextMenuOpen 事件。从那里,您可以访问 ContextMenuEventArgs.OriginalSource 属性,以获取事件源自的元素。
你的问题很常见...ContextMenu
不是其余控件所在的主可视化树的一部分,因此默认情况下它没有正确的DataContext
。但是,您会很高兴听到解决此问题相对简单。我通常使用 Tag
属性将DataContext
传递给ContextMenu
:
<ListView.Resources>
<ContextMenu x:Key="ContextMenu" DataContext="{Binding PlacementTarget.Tag,
RelativeSource={RelativeSource Self}}">
<MenuItem Header="Run test with parameters" x:Name="runTestWithParams"
Click="runTestWithParams_Click" />
</ContextMenu>
</ListView.Resources>
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type YourNamespace:YourDataType}">
<Grid Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContextMenu="{StaticResource ContextMenu}">
<!--Define what your data objects look like here or just use this-->
<TextBlock Text="{Binding}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
现在,我以前没有以这种方式这样做过,所以我们可能会有一些问题需要解决,但无论如何都要试一试。当用户单击MenuItem
时,您现在应该可以使用 sender.DataContext
属性访问数据对象。让我知道它是怎么回事。