ValueMemberPath Bindung in AutoCompleteBox WPF gibt nur Top-Ergebnis in Zuname suchen?

StackOverflow https://stackoverflow.com/questions/4648527

  •  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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top