在PowerShell中使用XAML / WPF,如何填充列表框?

我在这里找到了许多很棒的主题,但似乎无法追查我的答案。 我正在使用Visual Studio制作GUI并将XAML复制/粘贴到PowerShell中。 我知道我应该在c#中这样做,但是因为我的知识还没有,所以对我来说它是纯粹的PowerShell。

所以我已经制作了我的GUI,但我似乎无法填充我的数据字段。 做其他事情,如文本框是可以解决的,但我似乎无法让这个listview /数据网格填充值。

在此处输入图像描述

此时,已删除与Azure的连接,直到我可以解决将此项添加到列表框的问题。

XAML绘制我的表单

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework') [xml]$XAML = @'     

将XAML加载到内存/制作对象中

 #Read XAML $reader=(New-Object System.Xml.XmlNodeReader $xaml) try{$Form=[Windows.Markup.XamlReader]::Load( $reader )} catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."} #=========================================================================== # Store Form Objects In PowerShell #=========================================================================== $xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "VMpick$($_.Name)" -Value $Form.FindName($_.Name)} 

我可能需要帮助的地方

 #Try to setup a dummy entry $vmpicklistView.items.Add( @{'VMName'='1';Status="AccessDenied";'Other'='1'}) #=========================================================================== # Shows the form #=========================================================================== $Form.ShowDialog() | out-null 

正如你从我的屏幕截图中看到的那样,当我添加一个绑定到列(我认为会实例化列并允许我为它们插入值… nope)时,当我尝试添加新项目时它们不再更新。 但是,我没有应用绑定的“其他”列至少显示了一些输出,但它错误地列出了Collection,就像它试图显示整个哈希表一样。

所以,我的最后一个问题是,如何将项目添加到列表视图?

好吧,我想出了答案。 事实certificate,当我使用.Add时,我应该将PowerShell自定义对象指定为我的重载,而不是像以前那样简单的哈希表。 当我将代码更改为以下内容时:

 #Add DisplayMemberBindings for all columns    

然后修改我的Add语句:

 $vmpicklistView.items.Add([pscustomobject]@{'VMName'='1';Status="Access Denied";Other="Yes"}) 

我能够填充我的田地,就像这样

 #Make Dummy Entries 1..15 | % { if ($_ % 2){$vmpicklistView.items.Add([pscustomobject]@{'VMName'="VM_$($_)";Status="Online";Other="Yes"})} else{$vmpicklistView.items.Add([pscustomobject]@{'VMName'="VM_$($_)";Status="Access Denied";Other="Yes"})} } 

在此处输入图像描述

我为什么要这样做?

以下是我为何需要这样做的解释。 PowerShell自定义对象提供了一个具有命名值的对象,我可以使用绑定来提取,而哈希表是键/值对的集合,不太适合此目的。

我希望这个答案能帮助那些像我一样难倒的人!

WPF通常用于绑定到viewmodel对象属性,而不是字典或哈希表条目。 有一种语法可以绑定到字典条目,这将使GridViewColumn绑定看起来像这样:

   

请注意使用方括号表示值来自索引器。

至于为什么“其他”列显示为“(Collection)”,我相信默认绑定只是显示对象而WPF必须将字典和哈希表呈现为“(Collection)”

尝试为其他人添加类似的绑定:

  

有一种更简单的方法可以做到这一点。

假设您有类似于上述问题的设置

         

在Powershell中,您可以从一些提供程序中获取对象列表(在本例中为ConfigurationManager)

 $DCs = Get-CMDeviceCollection | ? { $_.CollectionRules.RuleName -contains "OU Query" } 

现在这个开箱即用的属性与我的DisplayMemberBindings不对齐所以我们必须制作一个这样做的对象的集合

 $BindableDCs = $DCs | Select-Object -Property @{Name='CollectionName';Expression={$_.Name}}, @{Name='CollectionCount';Expression={$_.MemberCount}} 

现在(假设已经运行了加载XAML并发现命名元素并将它们放入powershell变量的代码)

 $Collections.ItemsSource = $BindableDCs 

完成。

或者,如果你想做一个内衬powershell方式

 $Collections.ItemsSource = Get-CMDeviceCollection | ? { $_.CollectionRules.RuleName -contains "OU Query" } | Select-Object -Property @{Name='CollectionName';Expression={$_.Name}}, @{Name='CollectionCount';Expression={$_.MemberCount}}