我有几个按钮在不同的列表框中执行相同的功能(对它们进行排序,或打开 Out-GridView 来搜索它们)。我想通过向循环中的按钮添加单击事件来使我的代码更加“DRY”。但是,当我尝试时,所有按钮仅执行循环中最后一个按钮的功能。
这是我的代码:
$gui.btnNewUserGroupsSort.Add_Click({
SortListbox -listboxName "lsbNewUserGroups"
})
$gui.btnNewUserHuntGroupsSort.Add_Click({
SortListbox -listboxName "lsbNewUserHuntGroups"
})
$gui.btnAvailableGroupsSort.Add_Click({
SortListbox -listboxName "lsbAvailableGroups"
})
$gui.btnAvailableHuntGroupsSort.Add_Click({
SortListbox -listboxName "lsbAvailableHuntGroups"
})
如果有解决方案,我想使用以下代码:
$sortCategories = @(
"NewUserGroups",
"NewUserHuntGroups",
"AvailableGroups",
"AvailableHuntGroups"
)
Foreach ($sortCategory in $sortCategories) {
$button = "btn$($sortCategory)Sort"
$listbox = "lsb$($sortCategory)"
$gui.$button.Add_Click({
SortListbox -listboxName $listbox
})
}
我尝试向单击事件添加 GetNewClosure() 方法,但是当我这样做时,由于范围问题(我认为),我无法再调用 SortListbox 函数。
您需要的是一个 closure 来捕获每次迭代中
$listbox
变量的当前值:
# ...
$listbox = "lsb${sortCategory}"
$gui.$button.Add_Click({
SortListbox -listboxName $listbox
}.GetNewClosure())
# ...
注:
.GetNewClosure()
捕获调用者的局部变量的副本。