ValueMemberPath Legatura in AutoCompleteBox WPF restituisce solo top risultato in ultima ricerca nome?
-
09-10-2019 - |
Domanda
Sono stato con AutoCompleteBox in WPF Toolkit ed è quasi soddisfa tutte le mie esigenze, tutti ad eccezione di questo fastidioso ValueMemberPath
vincolante. Questo è il valore che la suggeriscono scatola volontà di completamento automatico da.
Così ho questo ultimo campo di nome, e quando un utente inizia a digitare in un cognome, ho dinamicamente recuperare i primi 10 risultati in base a questo. Tuttavia, se l'utente digita in 'Smith' e di selezionare e dicono che il quarto nome nella lista, recupera sempre il primo risultato della lista suggerimento, perché ValueMemberPath
è impostato su filtro LastName
. E 'sempre e solo pensa "Smith" è il primo risultato, anche se ci sono 50 fabbri con diversi nomi.
Sono stato wracking mio cervello cercando di capire come incorporare nome con questa proprietà. Ho provato a cambiare ValueMemberPath
ad essere un campo FullName
che eguagliato cognome e cognome. Il suggeriscono scatola ferma l'ordinamento non appena viene inserita una virgola, o se si tratta di cognome 'spazio' cognome che non funziona neanche.
Inoltre ho incontrato problemi con ValueMemberPath
perché questo valore non può essere modificato in modo dinamico, e non c'è bug per cui è nullo durante il debug: AutoCompleteBox Bug:. ValueMemberPath è Null
I capire se nessuno ha una soluzione completa. Ho solo pensato che avrei porre la domanda nel caso in cui la gente incorrere in questo in futuro e non sono sicuro di come gestire questa situazione.
Soluzione
Questo è un bug nel AutoCompleteBox
. Interna per il controllo delle proprietà ValueMemberPath
e ValueMemberBinding
sono implementati utilizzando un tipo chiamato BindingEvaluator
. Questa classe è un FrameworkElement
che gli usi AutoCompleteBox
da fare valore indiretto vincolante.
Il problema è che quando un BindingEvaluator
è scollegato dall'albero logico, vincolante non funziona. Ecco come AutoCompleteBox
deve gestire la sua BindingEvaluator
in modo per farlo funzionare:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new { FirstName = "Bill", LastName = "Smith" };
var valueBindingEvaluator = new BindingEvaluator<string>();
AddLogicalChild(valueBindingEvaluator);
valueBindingEvaluator.ValueBinding = new Binding("FirstName");
var value = valueBindingEvaluator.GetDynamicValue(DataContext);
}
Questo è un abbastanza facile bug da risolvere se si è disposti a ricompilare il WPF Toolkit da soli.
public Binding ValueMemberBinding
{
get
{
return _valueBindingEvaluator != null ?
_valueBindingEvaluator.ValueBinding : null;
}
set
{
if (_valueBindingEvaluator == null)
{
_valueBindingEvaluator = new BindingEvaluator<string>();
AddLogicalChild(_valueBindingEvaluator);
}
_valueBindingEvaluator.ValueBinding = value;
}
}
Questo risolve anche il bug si è collegato al.