如何在PowerShell中的XAML中定义的DataGridTemplateColumn中将事件处理程序附加到Button?

时间:2014-06-11 18:29:37

标签: wpf xaml powershell datagrid powershell-v4.0

我有一些XAML我导入PowerShell脚本。它包含DataGrid,显示PowerShell cmdlet的结果。我添加了一个'编辑'使用DataGridTemplateColumn按钮到每一行。现在,我想为每个按钮添加一个事件处理程序。我可以在代码中完成:

$adUsersList_Results = $activeDirectory_Users_ListControl.FindName('ResultsDataGrid')
$dataTemplate = New-Object 'Windows.DataTemplate'
$buttonElement = New-Object 'Windows.FrameworkElementFactory' ([Windows.Controls.Button])
$buttonElement.SetValue([Windows.Controls.Button]::ContentProperty, "Edit")
$buttonElement.AddHandler([Windows.Controls.Button]::ClickEvent, [Windows.RoutedEventHandler]{
    PARAM (
        [Object]$sender,
        [Windows.RoutedEventArgs]$e
    )
    Write-Host "Clickety-click!"
    Write-Host $sender.DataContext
})
$dataTemplate.VisualTree = $buttonElement
$dataGridTemplateColumn = New-Object 'Windows.Controls.DataGridTemplateColumn'
$dataGridTemplateColumn.Header = 'Poo'
$dataGridTemplateColumn.CellTemplate = $dataTemplate
$adUsersList_Results.Columns.Add($dataGridTemplateColumn)

但它有点笨拙。 XAML看起来像这样:

<DataGrid Grid.Row="1"
          x:Name="ResultsDataGrid"
          IsReadOnly="True"
          HorizontalAlignment="Stretch"
          Margin="3"
          VerticalAlignment="Stretch">
  <DataGrid.Columns>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <Button Content="Edit" Width="60" x:Name="ADUserListButton"/>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

我尝试过使用FindName(&#39; ADUserListButton&#39;)但它不起作用。有没有办法将所有可视内容保存在XAML中,只是在PowerShell中执行事件处理程序?

除了:我了解Show-UI。我实际上在Show-UI和PowerShell&amp;中做了同样的事情。 XAML在决定哪一个最适合我们之前。

我也知道您可以在网格中进行编辑,但我不认为这种类型的数据具有出色的用户体验。

4 个答案:

答案 0 :(得分:0)

我不确定但是可能是因为您列出的XAML按钮没有处理程序连接吗?即。

<Button Content="Edit" Width="60" x:Name="ADUserListButton" Click="ADUserListButton_Click"/>

答案 1 :(得分:0)

我还没有使用powershell,但如果它是在usercontrol的.cs代码隐藏文件中,你可以试试GetTemplateChild(“你的控件名”)。

答案 2 :(得分:0)

下面是使用Powershell在数据网格内调用按钮的示例,希望这有帮助。

Add-Type -AssemblyName PresentationFramework

Function Check-Event($ev,$co,$da){
$comp=$co.trim()
$re = Get-EventLog Application -ComputerName "$comp" -InstanceId $ev -After $da
$res.Text += "There are "+$re.count+" events pf EventID $ev on Computer $Comp after the time $da ch"
}

[Xml]$Form = @"
  <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid HorizontalAlignment="Left" Height="151" Margin="112,35,0,0" VerticalAlignment="Top" Width="279"/>
        <Button Name="ADUserListButton" Content="Edit" HorizontalAlignment="Left" Margin="140,85,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox Name="Result" HorizontalAlignment="Left" Height="23" Margin="140,124,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="Hello World"/>
    </Grid>
</Window>

"@

$NR=(New-Object System.Xml.XmlNodeReader $Form)
$Win=[Windows.Markup.XamlReader]::Load( $NR )

$Start = $Win.FindName("ADUserListButton")
$res = $Win.FindName("Result")

$Start.Add_Click({
$event=$res.text
If($event -eq "") {
[System.Windows.MessageBox]::Show("Please make sure all values are entered", "Missing Values")} 
Else{Get-WMIObject -class Win32_ComputerSystem | select username -OutVariable a
$name=$a.username
[System.Windows.MessageBox]::Show("User name is $name", "Hello")
}
})

答案 3 :(得分:0)

我对列出大量数据的网格点击所做的工作,而不是为每个单元格创建代码,您可以在数据网格上创建一个单击处理程序,它获取所选行或单元格并对其执行某些操作。

$adUsersList_Results = $activeDirectory_Users_ListControl.FindName('ResultsDataGrid')
$adUsersList.Add_Click({
  $sender = $args[0]
  $e      = $args[1]
  $prop = $sender.SelectedItem.<#[Some property of the row]#>
  #do something with $prop....
})

不知道这是不是你要找的东西,而且我知道这有点晚了,但它可能有助于其他人......