首页 > 解决方案 > 为什么我的 Powershell WPF 数据绑定拉 System.Windows.Controls.ComboBoxItem: Test 1 而不是 Test 1

问题描述

我正在学习如何使用 Powershell 创建 WPF 表单。I have a ComboBox full of items, and when selected, they should populate a TextBox. 我使用数据绑定将 TextBox 的 Text 属性连接到当前选定的 ComboBox 项。但是当我选择一个项目时,它会填充为
System.Windows.Controls.ComboBoxItem: Test 1而不是Test 1.

示例程序输出

[xml]$Form = @"
<Window 

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Test Window" Height="200" Width="400">

    <StackPanel>

        <ComboBox Name="ComboBox1" Margin="10"> 
            <ComboBoxItem>Test 1</ComboBoxItem>
            <ComboBoxItem>Test 2</ComboBoxItem>
        </ComboBox>

        <TextBox Name="textBox" Margin="10" Text="{Binding ElementName=ComboBox1, Path=SelectedValue}"/>

    </StackPanel>
</Window>

"@


$NR=(New-Object System.Xml.XmlNodeReader $Form)
$WIN=[Windows.Markup.XamlReader]::Load( $NR )

$WIN.Showdialog()

我已经在 C# 中看到了一些其他方法来执行此操作,但我试图将其作为一个 Powershell 脚本来执行。

标签: wpfpowershell

解决方案


最好的方法可能是使 ComboBox 可编辑并丢弃基于 TextBox 的方法:

<ComboBox Name="ComboBox1" Margin="10" IsEditable="True"> 
    ...

这使用户不仅可以从下拉列表中选择文本 (ComboBoxItems),还允许他们在 ComboBoxItems 本身保持不变/未更改的情况下输入和修改当前文本。


但是,如果确实需要通过 TextBox 更改 ComboBoxItems 本身的文本,则需要绑定ContentComboBoxItem 的属性。像这样:

<TextBox Name="textBox" Margin="10" Text="{Binding SelectedItem.Content, ElementName=ComboBox1}"/>

编辑文本框中的文本后,组合框中的项目将相应更改(当文本框失去焦点时)。

如果您希望 ComboBoxItem “实时”跟随文本框中的编辑,请将绑定更改为:

Text="{Binding SelectedItem.Content, ElementName=ComboBox1, UpdateSourceTrigger=PropertyChanged}"

推荐阅读