首页 > 解决方案 > 从 WPF/PowerShell 中的数据网格上下文菜单中获取单击的 MenuItem 标头值

问题描述

在通过 PowerShell 的 WPF DataGrid 中,我添加了一个上下文菜单和一个数组中的 MenuItems。我想获取单击的 MenuItem 的标头值以进一步处理单击事件。我曾尝试将 add_Click 事件添加到 MenuItem 对象,但它确实返回任何值。我正在寻找一些想法来获得这种情况下的 Header 值(或者)是否有任何不同的更好的方法来实现这个目标。提前致谢。

[xml]$inputXML=@"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    Title="MainWindow" Height="275" Width="375">
<Window.InputBindings>
        <KeyBinding x:Name="keyTest" Modifiers="Control" Key="N" Command="{Binding CreateCustomerCommand}" />
</Window.InputBindings>

<Grid>
    <DataGrid x:Name="dg" Margin="5,5,0,0" Height="250" Width="350" ColumnWidth="Auto" AlternationCount="1" IsReadOnly="True" SelectionMode="Extended" SelectionUnit="Cell" Background="White" ClipboardCopyMode="IncludeHeader" > 
        <DataGrid.ContextMenu >
            <ContextMenu x:Name="cxmenu" />
        </DataGrid.ContextMenu>
    </DataGrid>
</Grid>
</Window>
"@

[xml]$XAML = $inputXML

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load($reader)

$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'x:Name')]]") | %{Set-Variable -Name "$($_.Name)" -Value $Window.FindName($_.Name)}

#sample data
$DataSet = New-Object System.Data.DataSet
$Table = $DataSet.Tables.Add("Table")
$Properties = @("Country","Capital","Population")
$Properties | foreach {
 $Column = New-Object System.Data.DataColumn($_)
 $Table.Columns.Add($Column)
 }
$Null=$Table.Rows.Add("USA","Washington, D.C","658,893")
$Null=$Table.Rows.Add("China PR","Beijing","20,693,000")
$Null=$Table.Rows.Add("India","New Delhi","16,787,949") 
$Null=$Table.Rows.Add("Japan","Tokyo","13,189,000")
$Null=$Table.Rows.Add("Philippines","Manila","12,877,253")
$Null=$Table.Rows.Add("Russia","Moscow","11,541,000")
$Null=$Table.Rows.Add("Egypt","Cairo","10,230,350")

#populate datagrid
$DataView = New-Object System.Data.DataView($Table)
$array = New-Object System.Collections.ArrayList
[void] $array.AddRange($DataView)       
$dg.clear()
$dg.ItemsSource = $array
$dg.IsReadOnly = $true

#add MenuItem to context menu
$cxMenuitem = New-Object Windows.Controls.MenuItem
$header = ('Test1','Test2','Test3')
for ($i = 0; $i -le $header.Count -1; $i++)
        {
            $cxMenuitem.Header = [string]$header[$i]
            $cxMenu.Items.Add($cxMenuitem.Header)
        }

$cxMenuitem.Add_Click({    
    #Get the Header of the clicked MenuItem from Context Manu here for further handling
    [System.Windows.MessageBox]::Show($cxMenu.Items)
})

#Display Form
$Window.ShowDialog() | Out-Null

标签: wpfpowershelldatagridcontextmenumenuitem

解决方案


您应该能够转换$args[0]为 aMenuItem并直接访问其Header属性:

$cxMenuitem.Add_Click({    
    $sender = [System.Windows.Controls.MenuItem]$args[0]
    # Use $sender.Header ...
})

推荐阅读