2017-09-08 37 views
0

我有一个问题,即在用户的每次按键时,AutoCompleteTextView会快速隐藏并再次出现(使用更新后的一组值)。MvxAutoCompleteTextView下拉菜单重新打开每个按键

请建议我的问题在哪里,以及您是否在下面的代码中看到任何其他问题。

绑定在View:

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布局:

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

查看型号代码:

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)); 
    } 
} 

我用MvvmCross 4.0(升级不是一个选项)。

注:我尝试使用ObservableCollection代替IList和删除/添加项目(不重新分配集合本身),但在此之后的CurrentEmailEntry的setter停止接收值用户输入的第一个字符到后文本视图。 MvxFilteringAdapter内部的代码似乎停留在等待重置事件。

回答

1

既然没有人在这里或在MvvmCross Xamarin Slack频道上回答我最终发现了我自己的解决方案。

这是重新创建绑定到ItemsSource的列表,导致有问题的奇怪行为。

ObservableCollectionClear()/Add(),而不是重新创建确实是要走的路。上一个问题段落中描述的卡住行为(等待重置事件)是由于没有正确的线程分派(我的应用程序是多线程的)而导致的。

只要我用代理集合包装了我的可观察集合,该代理集合始终在UI线程上提出CollectionChanged事件,问题就消失了。

这里留下来为了子孙后代的利益。