ValueMemberPath Bindung in AutoCompleteBox WPF gibt nur Top-Ergebnis in Zuname suchen?
-
09-10-2019 - |
Frage
Ich habe AutoCompleteBox im WPF-Toolkit wurde mit und erfüllt so gut wie alle meine Bedürfnisse, alle außer dieser lästigen ValueMemberPath
verbindlich. Dies ist der Wert, den die Box Auto-Vervollständigen vorschlagen durch.
So habe ich dieses letzte Namensfeld, und wenn ein Benutzer der Eingabe in einem Nachnamen beginnt, ich abrufen dynamisch die Top-10-Ergebnisse auf der Grundlage dieser. wenn der Benutzer in ‚Smith‘ und wählen sagt jedoch den 4. Namen in der Liste, ruft es immer das erste Ergebnis in der Vorschlagsliste, weil ValueMemberPath
zum Filter durch LastName
eingestellt ist. Es ist immer nur denkt „Smith“ ist das erste Ergebnis, selbst wenn es 50 smiths mit unterschiedlichen Vornamen.
Ich habe wracking mein Gehirn, um herauszufinden, wie man mit dieser Eigenschaft Vorname einzuarbeiten. Ich habe versucht, ValueMemberPath
zu ändern ein FullName
Feld zu sein, den Nachnamen und Vornamen erreicht. Die vorschlagen Box stoppt Sortierung, sobald ein Komma eingegeben wird, oder wenn es Vorname ‚Raum‘ Nachname ist, die entweder nicht funktioniert.
Ich lief auch Probleme mit ValueMemberPath
da dieser Wert nicht dynamisch verändert werden kann, und es gibt Fehler, wo es null ist beim Debuggen: AutoCompleteBox Bug:. ValueMemberPath ist Null
Ich verstehe, wenn niemand eine komplette Lösung. Ich dachte, ich würde die Frage stellen, falls die Menschen in diesen in der Zukunft laufen und sind nicht sicher, wie das zu handhaben.
Lösung
Das ist ein Fehler in den AutoCompleteBox
. Interne an die Steuerung der ValueMemberPath
und ValueMemberBinding
Eigenschaften implementiert eine Art namens BindingEvaluator
. Diese Klasse ist ein FrameworkElement
, dass die AutoCompleteBox
Verwendungen Bindung indirekten Wert zu tun.
Das Problem ist, dass, wenn ein BindingEvaluator
von der logischen Struktur getrennt ist, die Bindung funktioniert nicht. Hier ist, wie AutoCompleteBox
braucht seine BindingEvaluator
, um es an die Arbeit zu verwalten:
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);
}
Dies ist ein ziemlich einfacher Fehler zu beheben, wenn Sie bereit sind, den WPF-Toolkit selbst neu zu kompilieren.
public Binding ValueMemberBinding
{
get
{
return _valueBindingEvaluator != null ?
_valueBindingEvaluator.ValueBinding : null;
}
set
{
if (_valueBindingEvaluator == null)
{
_valueBindingEvaluator = new BindingEvaluator<string>();
AddLogicalChild(_valueBindingEvaluator);
}
_valueBindingEvaluator.ValueBinding = value;
}
}
Dies behebt auch den Fehler, den Sie verknüpft.