我可以让 WPF 组合框将子字符串视为新值吗?

本文关键字:字符串 新值吗 WPF 组合 我可以 | 更新日期: 2024-11-08 19:46:48

我正在使用由以下定义的组合框:

    <ComboBox Grid.Column="2" Height="29" HorizontalAlignment="Left" Margin="137,192,0,0" Name="componentsComboBox" VerticalAlignment="Top" Width="224" 
              IsEditable="True"
              TextSearch.TextPath="Name">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox> 

..以按对象的"名称"属性显示对象列表。 我观察到以下行为:

  1. 单击下拉列表中的某个项目,然后组件组合框.选定值(和 .选定项)对应于单击的项目。还行!
  2. 开始键入项目的名称,自动完成会在您键入时填写,.选定值(和 .选定项)对应于自动完成的项。 伟大!
  3. 开始键入项目的名称,自动完成会在您键入时填写,点击删除以仅截断为您实际键入的内容。选定值和 .选定项仍对应于自动完成项。 不!糟糕的WPF!坏!
  4. 与 3 类似的行为,如果从文本框部分的末尾删除字符

本质上,如果我有一个包含两个对象的列表,例如,

{ new Component() { Name = "COMPONENT1"}, 
  new Component() { Name = "COMPONENT2"} }

我想要这些值:

  • COMPONENT1
  • COMPONENT2

出现在下拉部分中,如果用户输入"COMP",我想识别他们输入了新值,但正如它所代表的那样,控件看起来像他们选择了COMPONENT1。

我在这里错过了什么?

我可以让 WPF 组合框将子字符串视为新值吗?

您可以通过

分别将IsEditable和IsReadOnly属性设置为True和False,在WPF中轻松执行此操作。

编号: http://msdn.microsoft.com/en-us/library/system.windows.controls.combobox.iseditable.aspx

例如,如何允许用户在 WPF 中的组合框中编辑文本?

<Window x:Class="LearnWPF.EditableComboBox.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="LearnWPF.EditableComboBox" Height="300" Width="300" 
    > 
  <Window.Resources> 
    <XmlDataProvider x:Key="items" XPath="//item"> 
      <x:XData> 
        <items xmlns=""> 
          <item>01</item> 
          <item>02</item> 
          <item>03</item> 
        </items> 
      </x:XData> 
    </XmlDataProvider> 
  </Window.Resources> 
    <Grid> 
      <ComboBox IsEditable="True" DataContext="{StaticResource items}" 
                ItemsSource="{Binding}"/> 
    </Grid> 
</Window>

我今天经历了这种行为,并同意从表面上看,这似乎是一个错误。 不过,深入挖掘会发现一些灰色地带。

我认为这里发生的事情是,每次更新文本框时,控件都会运行前缀匹配算法,而不管导致文本框更新的击键如何。 因此,当您删除文本的自动完成部分时,前缀匹配算法仍与控件的 ItemsSource 中的项匹配;该控件不会尝试推断最终用户刚刚删除了自动完成的部分,因此算法不应运行。

回复:您对 akjoshi 响应的评论,当您删除"2"时,在组合框的文本框中只留下"0",前缀匹配算法正确匹配"01"项。

我使用的解决方法是仅绑定到 ComboBox 的 Text 属性,并基于该属性构建所有视图模型逻辑。 SelectedItem、SelectedIndex 和 SelectedValue 完全没有绑定。