2017-09-08 1 views
0

Ich habe ein Problem, wobei bei jedem Tastendruck vom Benutzer die AutoCompleteTextView schnell versteckt und wieder erscheint (mit einem aktualisierten Satz von Werten).MvxAutoCompleteTextView Dropdown öffnet sich wieder bei jedem Tastendruck

Bitte schlagen Sie vor, wo mein Problem sein könnte und ob Sie weitere Probleme mit dem unten stehenden Code sehen.

Bindung in der Ansicht:

bindingSet 
    .Bind(emailAutoCompleteTextView) 
    .For(t => t.Text) 
    .To(vm => vm.Email); 

bindingSet 
    .Bind(emailAutoCompleteTextView) 
    .For(t => t.PartialText) 
    .To(vm => vm.CurrentEmailEntry); 

bindingSet 
    .Bind(emailAutoCompleteTextView) 
    .For(t => t.ItemsSource) 
    .To(vm => vm.CurrentEmailAutoCompleteSuggestions); 

AXML Layout:

<mvvmcross.droid.support.v7.appcompat.widget.MvxAppCompatAutoCompleteTextView 
    android:id="@+id/EmailAutoCompleteTextView" 
    android:layout_marginTop="@dimen/PaddingBetweenUserInputFields" 
    android:completionThreshold="1" 
    android:inputType="textEmailAddress" /> 

Ansicht Modell-Code:

private string _currentEmailEntry; 

public string CurrentEmailEntry 
{ 
    get 
    { 
     return _currentEmailEntry; 
    } 
    set 
    { 
     _currentEmailEntry = value; 

     if (value == string.Empty) 
     { 
      _currentEmailEntry = null; 
     } 

     CurrentEmailAutoCompleteSuggestions = _emailAutoCompleteList 
      .Where(email => email.StartsWith(_currentEmailEntry, StringComparison.OrdinalIgnoreCase)) 
      .ToArray(); 

     RaisePropertyChanged(nameof(CurrentEmailEntry)); 
    } 
}   

private static readonly string[] _emailAutoCompleteList = {"Gordon", "Gordy", "Go", "Freeman", "Is", "Alive"}; 

private IList<string> _currentEmailAutoCompleteSuggestions = _emailAutoCompleteList.ToList(); 

public IList<string> CurrentEmailAutoCompleteSuggestions 
{ 
    get { return _currentEmailAutoCompleteSuggestions; } 
    set 
    { 
     if (ReferenceEquals(_currentEmailAutoCompleteSuggestions, value)) 
      return; 

     _currentEmailAutoCompleteSuggestions = value; 

     RaisePropertyChanged(nameof(CurrentEmailAutoCompleteSuggestions)); 
    } 
} 

Ich benutze MvvmCross 4.0 (Upgrade ist keine Option).

NB: I versucht, eine ObservableCollection anstelle eines IList und zu Entfernen/Hinzufügen von Elementen, um es (nicht neu zuweisen die Sammlung selbst) verwendet, aber nach, dass der Setter für CurrentEmailEntry gestoppt Werte, nachdem der Benutzer eingegeben das erste Zeichen in die Aufnahme Textvorschau. Der Code innerhalb MvxFilteringAdapter scheint zu warten, auf ein Reset-Ereignis warten.

Antwort

1

Da niemand hier oder auf dem MvvmCross Xamarin Slack-Kanal geantwortet hat, habe ich irgendwann selbst die Lösung gefunden.

Es war die Wiederherstellung der Liste an die ItemsSource gebunden, die zu dem seltsamen Verhalten in Frage.

Die ObservableCollection mit Clear()/Add() statt neu zu erstellen war in der Tat der Weg zu gehen. Das festgefahrene Verhalten (Warten auf das Reset-Ereignis), das im letzten Frageabschnitt beschrieben wurde, wurde durch das Fehlen einer ordnungsgemäßen Thread-Verteilung verursacht (meine Anwendung ist Multi-Threading).

Sobald ich meine beobachtbaren Sammlung mit einer Proxy-Sammlung eingewickelt, die das CollectionChanged Ereignis auf dem UI-Thread immer erhöht, verschwand das Problem.

Das hier für zukünftige Generationen zu verlassen.

Verwandte Themen