Как отображать параметры из массива в PowerShell при создании ComboBox в XAML - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю пользовательский интерфейс wpf в powershell, используя xaml. Я пытаюсь заполнить поле со списком массивом, и всякий раз, когда я загружаю окно / комбинированный список, не появляется никаких вариантов для выбора. Я пробовал несколько способов решить эту проблему, в том числе с помощью элемента ItemsSource в блоке сценариев xaml, с помощью DisplayMemberPath внутри и снаружи блока xaml, создавая функцию, помогающую отображать окно, а затем передавая переменные изнутри окна в блок сценариев.

Пожалуйста, дайте мне знать, что я делаю неправильно - любая помощь приветствуется.

Do {
    Connect-AzAccount -ErrorAction SilentlyContinue
    $AzureAccount = Get-AzContext
    $CurrentAccount = $AzureAccount.Account.Id
    $CurrentAccount
} While ([String]$AzureAccount::isnullorempty)

Do {
    # Select Subscription
    Try {
        $azureSubscription = (Get-AzSubscription | Sort-Object Name | Out-GridView -Title "Choose your Azure subscription and click OK." -PassThru)
        Write-host "Switching to Azure subscription: $($azureSubscription.Name)"  -ForegroundColor Green;
        $azureSubscriptionInfo = Select-AzSubscription -SubscriptionId $azureSubscription.Id
    } Catch {
        Write-Output "Script Terminated"
    }
    # Select Location
    Try {
        $azureLocation = (Get-AzLocation | Sort-Object Name | Out-GridView -Title "Chosose your Azure location and click OK." -PassThru)
        Write-Host "Switching to Azure location: $($azureLocation.DisplayName)" -ForegroundColor Green
    } Catch {
        Write-Output "Script Terminated"
    }
    if ([String]$azureSubscription::isnullorempty) {
        $Primary = "False"
    } elseif ([String]$azureLocation::isnullorempty) {
        $Primary = "False"
    } 
} while ($Primary -eq "False")

# Get Virtual Networks and associated Subnets
$vnet = Get-AzVirtualNetwork
$vnetList = @()
$subnetsList = @()
foreach ($vn in $vnet) {
    if ($vnet.Location -eq $azureLocation.Location) { 
        $vnetList += $vnet.Name 
        $subnetsList += $vnet.Subnets.Name }
}
$vnetList = $vnetList | Where-Object { $_ } | Select-Object -Unique
$subnetsList = $subnetsList | Where-Object { $_ } | Select-Object -Unique

Add-Type -AssemblyName PresentationFramework
[xml]$xaml = @"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Window" Title="Virtual Machine Deployment Tool" WindowStartupLocation="CenterScreen"
    SizeToContent="WidthAndHeight" >
    <Grid x:Name="Grid">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <StackPanel Margin="10">
            <ComboBox x:Name="vnselect" Margin="5" Width="100" />
        </StackPanel>
    </Grid>
</Window>
"@
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)
$window.ShowDialog() | Out-Null

$vnselect = $window.FindName("vnselect")
foreach ($item in $vnetList) {
    $vnselect.Items.Add($item)
}

enter image description here

1 Ответ

0 голосов
/ 01 апреля 2020

Код, который добавил элементы в ComboBox, должен быть помещен перед $window.Showdialog(). Это разрешение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...