每次按键时,MvxAutoCompleteTextView下拉列表都会重新打开

时间:2017-09-08 11:50:26

标签: android xamarin mvvmcross autocompletetextview

我遇到一个问题,即在用户的每次按键时,AutoCompleteTextView会快速隐藏并重新显示(使用更新的值集)。

请告知我的问题所在,以及您是否在以下代码中看到任何其他问题。

在视图中绑定:

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 个答案:

答案 0 :(得分:1)

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

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

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

只要我的observable集合包含一个始终在UI线程上引发CollectionChanged事件的代理集合,问题就会消失。

离开这里为了后代的利益。