0

我有 2 列的“gridview 样式”列表视图。我想知道如何获取我称为上下文菜单的项目的第一列值(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>

这是 contextMenu 按钮处理程序:

    private void runTestWithParams_Click(object sender, RoutedEventArgs e)
    {
        string valueOfFirstColumn = // something like ItemThatWasClicked["ID"].ToString();     
    }

如果您有任何想法,请帮助我。

找到解决方案

有必要创建 RightMouseUp 事件的处理程序并从其发送者那里获取我需要的值,因为 Context_Menu_button_Click 的发送者不包含有关它被单击的项目的信息,但包含有关 ContextMenu 的信息。所以......我是这样处理的:

处理程序:

    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>

谢谢大家!

4

2 回答 2

0

您的问题是一个常见问题......它不是其余控件所在的主视觉树的一部分,因此默认情况下ContextMenu它没有正确的。DataContext但是,您会很高兴听到解决此问题相对简单。我通常使用该Tag属性将其传递DataContextContextMenu

<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属性访问数据对象。让我知道事情的后续。

于 2013-10-16T15:24:38.500 回答
0

另一种解决方案是处理ListView 上的ContextMenuOpening 事件。从那里,您可以访问ContextMenuEventArgs.OriginalSource属性以获取事件起源的元素。

于 2013-10-16T15:23:53.500 回答