Wpf 使用关联菜单输出GridView

Wpf 使用关联菜单输出GridView,wpf,powershell,datagrid,contextmenu,Wpf,Powershell,Datagrid,Contextmenu,我想将上下文菜单与Out GridView窗口相关联OutGridView似乎没有实现这一点的本地方法 下面是一个输出数据网格的函数 下面是一个示例,其中文件夹项通过管道传输到Out DataGrid。要显示的属性被传递到数据网格中。定义了一个上下文菜单,它提供了一些操作: ls 'C:\Windows' | Out-DataGrid FullName, Extension, Mode, Attributes, LastWriteTime ` -context_menu_ite

我想将上下文菜单与
Out GridView
窗口相关联
OutGridView
似乎没有实现这一点的本地方法

下面是一个输出数据网格的
函数

下面是一个示例,其中文件夹项通过管道传输到
Out DataGrid
。要显示的属性被传递到数据网格中。定义了一个上下文菜单,它提供了一些操作:

ls 'C:\Windows' | 
    Out-DataGrid FullName, Extension, Mode, Attributes, LastWriteTime `
    -context_menu_items `
    @{ 
        name = 'Explorer'
        action = { param($dg) explorer $dg.SelectedItem.FullName } 
    }, 
    @{ 
        name = 'Notepad'
        action = { param($dg) notepad $dg.SelectedItem.FullName }
    },
    @{
        name = 'Run'
        action = { param($dg) & $dg.SelectedItem.FullName }
    }
生成的窗口和关联菜单:

列出后台作业的另一个示例:

Get-Job | Out-DataGrid Id, Name, State, HasMoreData, Command -context_menu_items `
    @{ 
        name = 'Receive'
        action = { param($dg) Receive-Job -Keep $dg.SelectedItem | Out-GridView } 
    },
    @{ 
        name = 'Remove'
        action = { param($dg) Remove-Job $dg.SelectedItem } 
    }
结果窗口:

我的问题是,有没有更好的方法

[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')

function Out-DataGrid ($properties, $context_menu_items)
{
    $data_grid = New-Object -TypeName System.Windows.Controls.DataGrid -Property @{
        IsReadOnly = $true
        AutoGenerateColumns = $false
    }

    foreach ($elt in $properties)
    {
        $data_grid.Columns.Add((New-Object -TypeName System.Windows.Controls.DataGridTextColumn `
            -Property @{
                Header = $elt
                Binding = (New-Object System.Windows.Data.Binding -ArgumentList @(, $elt))  
            }))
    }

    $data_grid.ItemsSource = @($input)

    if ($context_menu_items)
    {
        $data_grid.ContextMenu = New-Object -TypeName System.Windows.Controls.ContextMenu

        foreach ($elt in $context_menu_items)
        {
            $menu_item = New-Object -TypeName System.Windows.Controls.MenuItem

            $menu_item.Header = $elt.name

            $menu_item.Add_Click({ 

                param($sender, $event_args)

                $elt.action.Invoke($data_grid)                        

            }.GetNewClosure())

            $data_grid.ContextMenu.AddChild($menu_item)
        }
    }

    $grid = New-Object System.Windows.Controls.Grid

    $grid.Children.Add($data_grid) | Out-Null

    $window = New-Object System.Windows.Window -Property @{ Content = $grid }

    $window.ShowDialog() | Out-Null

    $data_grid.SelectedItem
}