Загрузка массива одного элемента в WPF ListBox - PullRequest
0 голосов
/ 17 июня 2019

У меня возникла проблема с этим кодом, когда если элемент (ы) в массиве возвращает менее двух строк, строка отображается в виде списка.

Например, если у меня есть два кластера. Окно списка даст мне возможность выбрать, скажем, Test-Cluster и Dev-Cluster; однако, если только Test-Cluster является единственным доступным кластером, в списке будет отображаться каждая буква строки как отдельная опция в списке. Я не могу понять, почему. Смотри картинку:

enter image description here

#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($_)
    }
})
<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>

1 Ответ

0 голосов
/ 17 июня 2019

Я думаю, это потому, что вы перебираете либо массив, либо, в случае отдельного элемента, строку. Попробуйте предварительно определить свой массив, затем добавьте (+=) к нему. Таким образом, в случае одной строки это все равно будет массив:

Edit:

Глядя на данные, похоже, что вам, возможно, придется явно преобразовать одну строку в массив, обернув $_ в @(..), чтобы получить: @($_)

Это либо преобразует строку в массив с одним значением, либо сохраняет существующий массив. Дополнительная информация: about_arrays

...
#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($_)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...