WPF和PowerShell:与ItemTemplate一起使用时,在ComboBox上设置所选项目

时间:2019-01-08 10:43:06

标签: wpf powershell combobox

我具有以下组合框设置,如下所示:

<ComboBox x:Name="ComboBoxCountry" HorizontalAlignment="Left" Margin="166,288,0,0" VerticalAlignment="Top" Width="470" Height="24" ScrollViewer.VerticalScrollBarVisibility="Visible">
<ComboBox.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding EnglishName}" />
    </DataTemplate>
</ComboBox.ItemTemplate>

作为我的脚本的一部分(其中提供了一些上下文),是一个具有模板功能的用户创建脚本,我将Selected Item和其他用户详细信息导出到Json。我使用以下命令将整个选定的项目都带走(为方便起见,我已从对象中删除了其他用户详细信息):

$UserObject = [PSCustomObject] @{
    "Country" = $MainScreenComboBoxCountry.SelectedItem
}

稍后我再次导入模板时,我的对象如下:

  

国家:@ {TwoLetterISORegionName = AW; EnglishName =阿鲁巴}

当我称呼它时,它可以正确展开,如下所示:

PS C:\Windows\system32> $JsonObject.UserDetails.Country

TwoLetterISORegionName EnglishName
---------------------- -----------
AW                     Aruba

但是,当我尝试将组合框设置回该所选项目时,它不起作用。我使用的命令是:

$MainScreenComboBoxCountry.SelectedItem = $JsonObject.UserDetails.Country

但是它不会选择该项目。我在程序加载时使用以下代码填充了组合框,效果很好:

Function Get-CountryCodes {
    $AllCultures = [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures)
    $CountryDetails = @()

    $AllCultures | ForEach-Object {
        $DisplayName = $_.DisplayName.Split(“(|)”)
        $RegionInfo = New-Object System.Globalization.RegionInfo $PsItem.Name
        $CountryDetails += [PsCustomObject]@{
            Name = $RegionInfo.Name
            EnglishName = $RegionInfo.EnglishName
            TwoLetterISORegionName = $RegionInfo.TwoLetterISORegionName
        }
    }

    $Countries = $CountryDetails | Select-Object -Unique -Property TwoLetterISORegionName,EnglishName | Sort-Object EnglishName

    $Countries = $Countries | Where-Object TwoLetterISORegionName -CMatch “^[A-Z]*$”
    Return $Countries
}
$MainScreenComboBoxCountry.ItemsSource = Get-CountryCodes

奇怪的是我没有任何错误,但是它并没有设置所选项目。

1 个答案:

答案 0 :(得分:0)

我改为使用以下代码来解决:

ForEach ($ComboBoxItem in $MainScreenComboBoxCountry.Items) {
            If ($ComboBoxItem.EnglishName -eq $JsonObject.UserDetails.Country.EnglishName) {
                $CorrectComboBoxItem = $ComboBoxItem
            }
        }
    $MainScreenComboBoxCountry.SelectedIndex = $MainScreenComboBoxCountry.Items.IndexOf($CorrectComboBoxItem)