在PowerShell中捕获WPF ComboBox选择到变量

时间:2017-06-21 23:38:57

标签: wpf powershell combobox

我正在为一些PowerShell构建一个GUI,它将为我工作的多站点组织创建资源邮箱。

表单中有两个ComboBox。第一个cboAgencies是从嵌套的哈希表中填充的。 This one, actually.第二个cboOffices填充了cboAgencies中所选代理机构的位置。

使用.Add_SelectionChanged()作为事件,我尝试将所选项目写入变量并执行其他一些操作,包括使用新选择的条件再次查询hash_AgencyOffices以填充下一个ComboBox。 / p>

以下是对此特定问题非常重要的代码:

$arr_Agencies = ($hash_AgencyOffices['Agency2','Agency1'].Keys | Sort-Object)
$arr_Agencies | ForEach-Object {
    $cboAgencies.Items.Add($_) | Out-Null
}

$cboAgencies.Add_SelectionChanged({
    $selectedAgency = $cboAgencies.SelectedItem.ToString()
})

问题是,$selectedAgency永远不会从cboAgencies获取所选项目。我可以检查$ cboDivisons.SelectedItem和$ cboAgencies.SelectedItem.ToString()并且它们都正确返回在UI中选择的项目,但该值未传递给$ selectedAgency。

我已尝试使用和不使用.ToString()部分,但这似乎没有什么区别。

我也读过一些关于装订的内容,但我仍然不确定这是否是"正确的"这样做的方法。

1 个答案:

答案 0 :(得分:2)

将我的评论转化为答案:

您可能会遇到范围问题;对于一个简单的演示,这段代码:

$a = 1
function test { $a = 2 }

test
$a

将设置$a的值,创建一个更改它的函数,调用该函数,然后..显示它没有更改。会发生什么是$a = 2在函数范围内创建一个名为$a的新变量,将其设置为2,然后在函数退出时抛弃它。

在您的代码中,尝试替换$Script:SelectedAgency以使其明确更新外部变量('脚本范围')。对此的演示是:

$a = 1
function test { $script:a = 2 }

test
$a

我还没有对任何人进行过这样的比喻,但我想到的是带有玻璃圆顶(城市,公园,温室等)的科幻景观。如果你将一个变量气球浮在外面,它会在天空中升起,每个人都可以看到它(这类似于全局或脚本范围)。进入圆顶,向上看,你看到外面的气球。

但如果你试图漂浮另一个气球供所有人看,它会被玻璃屋顶困住。你向上看,可以看到你的本地气球覆盖在外面的全球气球前面,所以它看起来几乎和你一样,但是外面或其他圆顶的其他人看不到它,他们看到原来的气球在天空中。除非您使用$script:$global:明确地将新内容推送到外面,否则其他人也可以看到它。

令人讨厌的微妙延伸,你可能会继续前行,然后跳过这个:

$a = 1
$b = @(1,2,3)

function test {
    $a = 2
    $b[0] = 2
}

test

如果你想象气球上的东西是你的东西所在的建筑物的邮政编码,那么看到天空中气球的人会去一栋楼。看到气球被困在你的圆顶上的人阻挡了外面的气球,可以转到另一个建筑物,这是更具体和相关的。但是一旦你到达建筑物,你可以移动你的东西。

所以$a = 2试图浮动一个新的邮政编码气球,而不是每个人都看到它。但是$b[0] = 2说“转到$b的全局邮政编码,然后更改”。每个去同一栋楼的人都会看到你对这些东西做出的改变,你没有更新名称 $b本身,所以没有范围问题。