可编辑的组合框被选中后被冻结以进行编辑
本文关键字:编辑 冻结 组合 | 更新日期: 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;