如何通过PowerShell、WPF和XAML删除DataGrid选中行?
PowerShell + WPF DataGrid 选中行删除无效排查方案
常见问题点及修复步骤
1. 选中行类型判断错误
绑定DataTable的DataGrid,选中项实际是DataRowView对象,不是直接的DataRow,直接删除会导致类型不匹配:
# 错误写法:直接操作SelectedItems $DataGrid.SelectedItems | ForEach-Object { $DataTable.Rows.Remove($_) } # 正确写法:提取Row对象 $selectedRows = $DataGrid.SelectedItems | ForEach-Object { $_.Row }
2. 未触发数据变更通知
修改DataTable后需要手动确认变更或刷新DataGrid视图,否则UI不会同步更新:
foreach ($row in $selectedRows) { $DataTable.Rows.Remove($row) } # 确认DataTable变更 $DataTable.AcceptChanges() # 强制刷新DataGrid $DataGrid.Items.Refresh()
3. 未在UI线程操作
WPF控件必须在UI线程修改,如果删除逻辑涉及后台线程调用,需要切换到UI线程执行:
$btnDelete.Add_Click({ $null = $DataGrid.Dispatcher.Invoke([Action]{ $selectedRows = $DataGrid.SelectedItems | ForEach-Object { $_.Row } foreach ($row in $selectedRows) { $DataTable.Rows.Remove($row) } $DataTable.AcceptChanges() $DataGrid.Items.Refresh() }) })
4. DataTable处于只读状态
检查DataTable的ReadOnly属性,若为True会阻止行删除:
if ($DataTable.ReadOnly) { $DataTable.ReadOnly = $false }
完整可运行代码片段
# 假设XAML中DataGrid命名为dgSCCMData,删除按钮命名为btnDelete $btnDelete.Add_Click({ $selectedRows = @() # 遍历选中项提取有效DataRow foreach ($item in $dgSCCMData.SelectedItems) { if ($item -is [System.Data.DataRowView]) { $selectedRows += $item.Row } } if ($selectedRows.Count -gt 0) { # 临时解绑避免UI报错 $dgSCCMData.ItemsSource = $null foreach ($row in $selectedRows) { $DataTable.Rows.Remove($row) } $DataTable.AcceptChanges() # 重新绑定数据 $dgSCCMData.ItemsSource = $DataTable.DefaultView } })
内容的提问来源于stack exchange,提问作者Ram Mansawala
相关产品推荐
相关产品推荐

