ValueMemberPath Legatura in AutoCompleteBox WPF restituisce solo top risultato in ultima ricerca nome?

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

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top