WPF:如何获取我称为上下文菜单的ListView元素的值?

时间:2013-10-16 14:51:38

标签: c# wpf listview

我在“gridview样式”中有2列的listview。我想知道如何得到我称之为上下文菜单的项目的第一列值(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 button handeler:

    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>

谢谢大家!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的问题很常见...... 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属性访问数据对象。让我知道它是怎么回事。