可编辑的组合框被选中后被冻结以进行编辑

本文关键字:编辑 冻结 组合 | 更新日期: 2023-09-27 17:54:42

我在wpf控件中有一个可编辑的组合框。

<ComboBox Width="200"  Name="quickSearchText"
    TextBoxBase.TextChanged="searchTextChanged"
    IsTextSearchEnabled="False" 
    StaysOpenOnEdit="True" IsEditable="True">
</ComboBox>

输入文本后,我正在更改组合框项目(如自动完成文本框)。

private void searchTextChanged(object sender, TextChangedEventArgs e)
{
    string text = quickSearchText.Text; //Get typing text.
    List<string> autoList = new List<string>();
    autoList.AddRange(suggestions.Where(suggestion => !string.IsNullOrEmpty(text)&& suggestion.StartsWith(text))); //Get possible suggestions.
   // Show all, if text is empty.
   if (string.IsNullOrEmpty(text) && autoList.Count == 0)
   {
       autoList.AddRange(suggestions);
   }
   quickSearchText.ItemsSource = autoList;
   quickSearchText.IsDropDownOpen = autoList.Count != 0; //Open if any.
}

如果我从下拉菜单中选择一个项目或键入文本并按下Enter, TextboxBase冻结,我无法编辑它。(但可以高亮显示文本并打开/关闭下拉菜单)

如何修复?

可编辑的组合框被选中后被冻结以进行编辑

当前解决方案不工作,因为这一行:

quickSearchText.ItemsSource = autoList;

这将重置您的ComboBox数据,因此在输入文本中所做的所有更改将丢失。

要使您的解决方案工作,您应该像下面这样使用数据绑定:

背后的代码:

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    autoList = new ObservableCollection<string>();
}
private List<string> suggestions;
public ObservableCollection<string> autoList { get; set; }
private void searchTextChanged(object sender, TextChangedEventArgs e)
{
    string text = quickSearchText.Text; //Get typing text.
    var suggestedList = suggestions.Where(suggestion => !string.IsNullOrEmpty(text) && suggestion.StartsWith(text)); //Get possible suggestions
    autoList.Clear();
    foreach (var item in suggestedList)
    {
        autoList.Add(item);
    }
    // Show all, if text is empty.
    if (string.IsNullOrEmpty(text) && autoList.Count == 0)
    {
        foreach (var item in suggestions)
        {
            autoList.Add(item);
        }
    }
    quickSearchText.IsDropDownOpen = autoList.Count != 0; //Open if any.
}
Xaml:

<ComboBox Width="200"  Name="quickSearchText"
            ItemsSource="{Binding autoList}"
            TextBoxBase.TextChanged="searchTextChanged"
            IsTextSearchEnabled="False" 
            StaysOpenOnEdit="True" IsEditable="True">
</ComboBox>

输入:

quickSearchText.ItemsSource = null;

作为searchTextChanged函数的第一行。似乎没有事先清除ItemsSource会导致奇怪的行为,将这一行放在前面似乎可以解决这个问题。

将此添加到您的searchTextChanged方法中以再次启用编辑。

quickSearchText.SelectedIndex = -1;