Wpf editable ComboBox:如何通过按Enter键将新文本输入到不在列表中的组合框

时间:2016-01-07 15:03:49

标签: c# .net wpf xaml combobox

问题:我无法在ComboBox中输入自定义文字,然后按输入关闭下拉列表,因为我的书面自定义文本会被所选项目覆盖下拉列表。

我使用 editable = true isTextSearchEnabled = true ComboBox 以及字符串列表:

<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. 输入第一个字母,例如:&#34; A&#34;。 - &GT;它打开下拉列表并选择以A开头的第一个名称。
  2. 在找到的名称的末尾键入一些附加字母(以获取不在列表中的新字符串)
  3. Enter - &gt;下拉窗口关闭,我的自定义文本将被列表中的选定文本覆盖。
  4. (但如果我按选项卡而不是回车,它会正常工作) 有谁知道如何解决这个问题?

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

2 个答案:

答案 0 :(得分:0)

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

这方面应该做的事情:

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

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

答案 1 :(得分:0)

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

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