2015-06-10 3 views
1

У меня есть управление wpf редактируемое combobox.Редактируемые Combobox замораживаются для редактирования после выбранного

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

После ввода текста Я меняю элементы 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 замер, и я не могу изменить его. (Но может выделить текст и открыть/закрыть выпадающее меню)

Как это исправить?

+0

Вы можете использовать 'Control & TextBox' 'Popup Control с Combobox'. В событии TextChanged из TextBox вы можете отображать/скрывать «всплывающие окна». –

+0

@Amol Bavannavar спасибо. это одно из решений. Но почему текущее решение не работает? –

ответ

2

В настоящее время решение не работает из-за этой линии:

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> 
+0

Использование ObservableCollection помогло мне, но привязанные данные не были обновлены в представлении, поэтому мне все равно придется сбросить ItemsSource по коду. –

1

Put в:

quickSearchText.ItemsSource = null; 

в качестве первой линии в функции searchTextChanged. Кажется, что не очистка ItemsSource заблаговременно вызывает странное поведение, и, по-видимому, эта строка сначала исправляет ее.

Смежные вопросы