2015-07-20 9 views
6

Nella mia applicazione WPF utilizzo una casella combinata. Quando l'utente desidera selezionare un articolo, può digitare lettere e la casella combinata salta alla voce successiva iniziando con queste lettere. Se l'utente interrompe la digitazione e ricomincia da capo dopo un certo ritardo, la casella combinata presume che l'utente abbia iniziato una nuova parola. Beh, questo è il solito comportamento di ComboBox, niente di speciale lì ... Il problema è che alcuni dei nostri utenti sono dattilografi lenti. C'è un modo per aumentare il tempo concesso tra digitare due lettere senza la casella combinata assumendo che l'utente stia cercando una nuova parola? Spero che tu sappia cosa intendo ...ComboBox WPF per dattilografi lenti

+3

Sembra che questa domanda è stato risposto prima: http://stackoverflow.com/questions/5973422/wpf-combobox -delayed-filtering –

+1

Hai considerato l'utilizzo di 'IsEditable =" True "'? In questo modo la Combo non si riavvia automaticamente, ma i tuoi utenti devono solo inserire il testo che vogliono filtrare, digitare e cancellare a loro piacimento. – almulo

+0

In altre parole, non esiste una funzione integrata per aumentare tale tempo? @JamesHarcourt la soluzione nel link ha una casella di testo per il filtraggio, non proprio quello che ho ma immagino che ti aiuterà a capire il modo giusto per risolvere il problema (sarà probabilmente un po 'più difficile non violare le regole di mvvm). –

risposta

0

Potresti andare al massimo e rotolare la tua casella combinata filtrabile. Dai un'occhiata a questo codice e verifica se è utile.

Il XAML:

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

Poi, sotto il cofano:

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)); 
}