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>

谢谢大家!

WPF:如何获取我调用上下文菜单的 ListView 元素的值

另一种解决方案是处理 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 属性访问数据对象。让我知道它是怎么回事。