首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一项的数组加载到WPF ListBox中。

将一项的数组加载到WPF ListBox中。
EN

Stack Overflow用户
提问于 2019-06-18 01:37:14
回答 1查看 275关注 0票数 0

我在这段代码中遇到了一个问题,如果数组中的item(s)返回的字符串少于两个,则该字符串显示为列表。

例如,如果我有两个集群。列表框可以让我选择Test-Cluster和Dev- cluster;但是,如果只有Test-Cluster是唯一可用的集群,则列表框将在列表框中将字符串的每个字母显示为不同的选项。我似乎想不出为什么。见图:

代码语言:javascript
运行
复制
#event: when Environment is selected
$wpFBoxEnvironment.Add_DropDownClosed({
    Disconnect-VIServer * -Confirm:$false
    #empty VCenters inside form 
    $wpFBoxSrcVCenter.Items.Clear()
    $wpFListTgtVCenters.Items.Clear()
    #empty Source VMs inside form 
    $wpFListSrcVMs.Items.Clear()
    #validate VI servers connetion and connect if session doesn't exist
    $VServers = $vdiEnvironments | 
                Where-Object Env -like $wpFBoxEnvironment.Text

    #notify use to wait for vCenter server login
    Write-Host "Logging in to all $($wpFBoxEnvironment.Text) servers. Please wait..."

    foreach ($VServer in $VServers) {
        $sessionID = ($global:DefaultVIServers | Where-Object -FilterScript {$_.Name -like $VServer.Name}).sessionId
        if ($sessionID) {
            Connect-VIServer -Server $VServer.Name -Session $sessionID
        } elseif ($credential) {
            Connect-VIServer -Server $VServer.Name -Credential $credential
        } else {
            throw 'Connection Error'
        }
    }

    $clusters = Get-Cluster | Select-Object Name, Uid
    $clusters | ForEach-Object {
        $_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.Uid.Split('@')[1].Split(':')[0]
    }

    $datastores = Get-Datastore | Select-Object -Property Name, DatastoreBrowserPath, FreeSpaceMB, CapacityMB
    $datastores | ForEach-Object {
        $_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.DatastoreBrowserPath.Split('\')[1].replace('@443','')
        $_.FreeSpaceMB = [int]$_.FreeSpaceMB
        $_.CapacityMB  = [int]$_.CapacityMB
    }

    $portgroups = Get-VDPortgroup | Select-Object VlanConfiguration, Name, NumPorts, Uid | ? VlanConfiguration -notlike "*0-4094*"
    $portgroups | ForEach-Object {
        $_ | Add-Member -MemberType NoteProperty -Name VCName -Value $_.Uid.Split('@')[1].Split(':')[0]
        $_.NumPorts = [int]$_.NumPorts
    }

    $vCenters = @()
    foreach ($vCenter in $VDIEnvironments) {
        #Find single clusters and padd array
        if (($clusters | ? VCName -like $vCenter.Name).Count -eq 1) {
            $clusters += ("-----")
        }
        $vCenter |
            Add-Member -MemberType NoteProperty -Name TargetCluster -Value (
                $clusters | ? VCName -like $vCenter.Name
            )[0].Name -Force
        $vCenter |
            Add-Member -MemberType NoteProperty -Name Clusters -Value $(
                $clusters | ? VCName -like $vCenter.Name
            ).Name -Force
        $vCenter |
            Add-Member -MemberType NoteProperty -Name TargetDatastore -Value $(
                $datastores | ? VCName -like $vCenter.Name | Sort-Object -Descending FreeSpaceMB
            )[0].Name -Force
        $vCenter |
            Add-Member -MemberType NoteProperty -Name Datastores -Value $(
                $datastores | ? VCName -like $vCenter.Name
            ).Name -Force 
        $vCenter |
            Add-Member -MemberType NoteProperty -Name TargetPortgroup -Value (
                $portgroups | ? VCName -like $vCenter.Name | Sort-Object -Descending NumPorts
            )[0].Name -Force
        $vCenter |
            Add-Member -MemberType NoteProperty -Name Portgroups -Value $(
                $portgroups | ? VCName -like $vCenter.Name
            ).Name -Force

        $vCenters += $vCenter
    }

    #fill VCenters inside form from selected Environment
    $selectedVCenters = $vCenters | 
        Where-Object Env -like $wpFBoxEnvironment.Text |
        Where-Object Datastores -ne $Null
    $selectedVCenters | ForEach-Object {
        $wpFBoxSrcVCenter.Items.Add($_.Name)
        $wpFListTgtVCenters.Items.Add($_) 
        $wpFListTgtVCenters.SelectedItems.Add($_)
    }
})
代码语言:javascript
运行
复制
<GridViewColumn Header="Target Cluster" 
                                     Width="160" >
                     <GridViewColumn.CellTemplate>
                        <DataTemplate>
                           <ComboBox ItemsSource="{Binding 'Clusters'}"
                                     SelectedItem="{Binding Path='TargetCluster', Mode=TwoWay}"
                                     Width="145"
                            />
                        </DataTemplate>
                     </GridViewColumn.CellTemplate>
                  </GridViewColumn>
EN

回答 1

Stack Overflow用户

发布于 2019-06-18 01:52:58

我认为这是因为您正在迭代一个数组,或者在单个项的情况下迭代一个字符串。尝试预定义数组,然后向其添加(+=)。这样,在单个字符串的情况下,它仍然是一个数组:

编辑:

查看数据,您可能必须显式地将单个字符串转换为数组,方法是将$_包装在@(..)中以获取:@($_)

这会将字符串转换为单个值数组,或者保留现有数组。更多信息:about_arrays

代码语言:javascript
运行
复制
...
#fill VCenters inside form from selected Environment

$selectedVCenters = @()
$selectedVCenters += $vCenters | 
   Where-Object Env -like $wpFBoxEnvironment.Text | 
   Where-Object Datastores -ne $Null
$selectedVCenters | ForEach-object {
   $wpFBoxSrcVCenter.Items.Add($_.Name)
   $wpFListTgtVCenters.Items.Add(@($_)) 
   $wpFListTgtVCenters.SelectedItems.Add($_)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56636321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档