2015-07-20 2 views
6

В моем приложении WPF я использую combobox. Когда пользователь хочет выбрать элемент, он может вводить буквы, а combobox переходит к следующей записи, начинающейся с этих букв. Если пользователь перестает печатать и запускается снова после некоторой задержки, combobox предполагает, что пользователь запустил новое слово. Ну, это обычное поведение ComboBox, ничего особенного ... Проблема в том, что некоторые из наших пользователей являются медленными. Есть ли способ увеличить время, разрешенное между вводом двух букв без combobox, предполагая, что пользователь ищет новое слово? Надеюсь, вы знаете, что я имею в виду ...WPF ComboBox для медленных программ

+3

Похоже, этот вопрос был дан ответ раньше: http://stackoverflow.com/questions/5973422/wpf-combobox -delayed-filtering –

+1

Считаете ли вы использование 'IsEditable =" True "'? Таким образом, Combo не перезапускается автоматически, но ваши пользователи просто должны вводить какой-либо текст, который они хотят фильтровать, печатать и удалять по своему усмотрению. – almulo

+0

Другими словами, нет встроенной функции, чтобы увеличить это время? @JamesHarcourt решение в ссылке имеет текстовое поле для фильтрации, но не совсем то, что у меня есть, но я думаю, это поможет выяснить правильный способ решения проблемы (возможно, это будет немного сложнее, не нарушая правила mvvm). –

ответ

0

Вы можете пройти полный проход и свернуть свой собственный фильтруемый поле со списком. Проверьте этот код и посмотрите, не поможет ли он.

Часть XAML:

<ComboBox x:Name="myComboBox" TextBoxBase.TextChanged="myComboBox_TextChanged" DisplayMemberPath="myDisplay" IsEditable="True" StaysOpenOnEdit="True" SelectionChanged="myComboBox_SelectionChanged" /> 

Затем под капотом:

ObservableCollection<myType> myCollection; 
public ICollectionView cvs { get; set; } 
public MyWindow() 
{ 
    InitializeComponent(); 

    myCollection = new ObservableCollection<myType>(); 
    cvs = CollectionViewSource.GetDefaultView(myCollection); 
    myComboBox.ItemsSource = cvs; 
    cvs.Filter = FilterOut; 
} 

private void myComboBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    cvs.Refresh(); 
} 

private bool FilterOut(object input) 
{ 
    myType item = (myType)input; 
    return (string.IsNullOrEmpty(myComboBox.Text) || item.myDisplay.Contains(myComboBox.Text)); 
}