You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF PowerShell项目中列表项迁移功能异常求助

WPF PowerShell 列表项迁移问题修复

问题根源

  • 变量作用域错误:AddUserClick函数中错误尝试将$DGMemberSearchListBox.ItemsSource赋值为$UserSearch,但$UserSearch是SearchDGUserClick内的局部变量,此处无法访问,直接导致左侧列表数据源被清空。
  • 数据源操作方式错误:ListBox通过ItemsSource绑定数据源后,直接调用Items.Add/Remove会引发异常或不生效,需直接操作绑定的集合对象。
  • 属性名拼写错误:排序时使用了错误的属性名SamaAccountName,正确应为SamAccountName。

修正后的代码

1. 全局定义可观察集合(用于UI绑定)

在脚本开头定义全局集合,确保函数间可共享且UI能自动响应集合变化:

Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase

# 全局可观察集合,作为左右列表的数据源
$global:searchUsersCollection = New-Object System.Collections.ObjectModel.ObservableCollection[PSObject]
$global:addedUsersCollection = New-Object System.Collections.ObjectModel.ObservableCollection[PSObject]

2. 修正搜索函数SearchDGUserClick

function SearchDGUserClick
{
    param($sender, $e)

    $query = $DGUserSearchText.Text
    $searchUsersCollection.Clear()
    
    # 查询AD用户并修正排序属性名
    $UserSearch = Get-ADUser -Filter "Name -like '*$query*'" | Select-Object SamAccountName | Sort-Property SamAccountName
    
    foreach ($user in $UserSearch) {
        $searchUsersCollection.Add($user)
    }
    
    $DGMemberSearchListBox.ItemsSource = $searchUsersCollection
}

3. 修正迁移函数AddUserClick

function AddUserClick
{
    param($sender, $e)

    # 先复制选中项到数组,避免遍历过程中集合变化引发异常
    $selectedItems = @($DGMemberSearchListBox.SelectedItems)
    
    foreach ($item in $selectedItems) {
        # 避免重复添加
        if (-not $addedUsersCollection.Contains($item)) {
            $addedUsersCollection.Add($item)
        }
        # 从左侧集合移除选中项
        $searchUsersCollection.Remove($item)
    }
    
    $DGMemberAddListBox.ItemsSource = $addedUsersCollection
}

额外注意事项

  • 建议在XAML初始化时就将左右ListBox的ItemsSource绑定到对应的全局集合,无需每次操作重复绑定。
  • 使用ObservableCollection的核心优势是集合内容变化时,UI会自动更新,无需手动刷新列表。

内容的提问来源于stack exchange,提问作者Kevlar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:25:00