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
相关产品推荐
相关产品推荐

