Wpf可编辑组合框:如何通过按enter键将不在列表中的新文本输入到组合框中

本文关键字:组合 新文本 列表 文本 输入 编辑 何通过 Wpf enter | 更新日期: 2023-09-27 18:29:32

问题:我无法在组合框中输入自定义文本并按enter关闭下拉列表,因为我编写的自定义文本被下拉列表中选定的项目覆盖。

我使用可编辑=trueisTextSearchEnabled=true组合框以及字符串列表:

<ComboBox 
   IsEditable="True" 
   IsTextSearchEnabled="True"
   ItemsSource="{Binding Names}"
   SelectedItem="{Binding SelectedName}"
   Text="{Binding Name}"
   >
   <ComboBox.Style>
     <Style>
         <EventSetter Event="TextBoxBase.TextChanged" 
                    Handler="cmbTextField_TextChanged" />
     </Style>
   </ComboBox.Style>
</ComboBox>

TextChanged:如果文本已更改,则打开组合框下拉列表

private void cmbTextField_TextChanged(object sender, TextChangedEventArgs e)
{
    var cmbx = sender as ComboBox;
    //Open the dropdwon 
    cmbx.IsDropDownOpen = true;       
}

如何解决问题:

  1. 输入第一个字母,例如:"A"。->它打开下拉列表并选择以A开头的第一个名称
  2. 在找到的名称末尾键入一些额外的字母(以获得不在列表中的新字符串)
  3. 按下Enter->下拉窗口将关闭,我的自定义文本将被列表中选定的文本覆盖

(但如果我按TAB而不是Enter键,它就可以正常工作)有人知道如何解决这个问题吗?

  1. 更新:该问题似乎与IsTextSearchEnabled=true属性有关

Wpf可编辑组合框:如何通过按enter键将不在列表中的新文本输入到组合框中

您可以尝试订阅OnPreviewKeyDown方法,该方法将在按键处理之前激发。当调用该方法时,您可以检查按下的键是否返回,并将其标记为已处理。

应该采取这样的措施:

private void cmbTextField_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
    if (e.KeyData == Keys.Return) { 
        e.Handled = true;
    }
}

请记住,此代码未经过测试。

我知道这篇文章发布已经很长时间了,但我通过注册到事件来解决它:SelectionChanged并关闭下拉菜单:

private void Combobox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cb = sender as ComboBox;
    cb.IsDropDownOpen = false;
}