Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个ListView共享一个ContextMenu,如何引用正确的对象?_C#_Wpf_Listview_Contextmenu - Fatal编程技术网

C# 多个ListView共享一个ContextMenu,如何引用正确的对象?

C# 多个ListView共享一个ContextMenu,如何引用正确的对象?,c#,wpf,listview,contextmenu,C#,Wpf,Listview,Contextmenu,我有许多ListView,每个都绑定到自己的ListCollectionView,每个都有相同的ContextMenu需求。我不想重复相同的ContextMenu N次,所以我在参考资料中定义它,并通过StaticResource引用它 当右键单击ListView中的某个项目X并单击某个菜单项时,如何访问codebehind中的对象X <Window.Resources> <ContextMenu x:Key="CommonContextMenu">

我有许多ListView,每个都绑定到自己的ListCollectionView,每个都有相同的ContextMenu需求。我不想重复相同的ContextMenu N次,所以我在参考资料中定义它,并通过StaticResource引用它

当右键单击ListView中的某个项目X并单击某个菜单项时,如何访问codebehind中的对象X

<Window.Resources>
    <ContextMenu x:Key="CommonContextMenu">
        <MenuItem Header="Do Stuff" Click="DoStuff_Click" />
    </ContextMenu>
</Window.Resources>

<ListView ItemsSource="{Binding Path=ListCollectionView1}" ContextMenu="{StaticResource CommonContextMenu}">
    ...
</ListView>

<ListView ItemsSource="{Binding Path=ListCollectionView2}" ContextMenu="{StaticResource CommonContextMenu}">
    ...
</ListView>

private void DoStuff_Click(object sender, RoutedEventArgs e)
{
    // how do i get the selected item of the right listview?
}
1) 将上下文菜单放在每个
列表视图
中的每个项目上,而不是放在每个
列表视图
本身上。这样可以避免在单击
列表视图中的空白时弹出关联菜单。为此,请使用
ListView.ItemContainerStyle
属性。(如果您确实需要
列表视图
本身的上下文菜单,请告诉我,我将相应地编辑此答案。)

public static ListView GetListView(this MenuItem menuItem)
{
    if (menuItem == null)
        return null;

    var contextMenu = menuItem.Parent as ContextMenu;
    if (contextMenu == null)
        return null;

    var listViewItem = contextMenu.PlacementTarget as ListViewItem;
    if (listViewItem == null)
        return null;

    return listViewItem.GetListView();
}

public static ListView GetListView(this ListViewItem item)
{
    for (DependencyObject i = item; i != null; i = VisualTreeHelper.GetParent(i))
    {
        var listView = i as ListView;
        if (listView != null)
            return listView;
    }

    return null;
}
<Window.Resources>
    <ContextMenu x:Key="CommonContextMenu">
        <MenuItem Header="Do Stuff" Click="DoStuff_Click" />
    </ContextMenu>
    <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="ContextMenu" Value="{StaticResource CommonContextMenu}" />
    </Style>
</Window.Resources>

<ListView ItemsSource="{Binding Path=ListCollectionView1}" ItemContainerStyle="{StaticResource ListViewItemStyle}">
    ...
</ListView>
<ListView ItemsSource="{Binding Path=ListCollectionView2}" ItemContainerStyle="{StaticResource ListViewItemStyle}">
    ...
</ListView>
private void DoStuff_Click(object sender, RoutedEventArgs e)
{
    var menuItem = sender as MenuItem;
    if (menuItem == null)
        return;

    var contextMenu = menuItem.Parent as ContextMenu;
    if (contextMenu == null)
        return;

    var listViewItem = contextMenu.PlacementTarget as ListViewItem;
    if (listViewItem == null)
        return;

    var listView = GetListView(listViewItem);
    if (listView == null)
        return;

    // do stuff here
}

private ListView GetListView(ListViewItem item)
{
    for (DependencyObject i = item; i != null; i = VisualTreeHelper.GetParent(i))
    {
        var listView = i as ListView;
        if (listView != null)
            return listView;
    }
    return null;
}