MvxAutoCompleteTextView下拉菜单重新打开每个按键
问题描述:
我有一个问题,即在用户的每次按键时,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
内部的代码似乎停留在等待重置事件。
答
既然没有人在这里或在MvvmCross Xamarin Slack频道上回答我最终发现了我自己的解决方案。
这是重新创建绑定到ItemsSource
的列表,导致有问题的奇怪行为。
的ObservableCollection
与Clear()/Add()
,而不是重新创建确实是要走的路。上一个问题段落中描述的卡住行为(等待重置事件)是由于没有正确的线程分派(我的应用程序是多线程的)而导致的。
只要我用代理集合包装了我的可观察集合,该代理集合始终在UI线程上提出CollectionChanged
事件,问题就消失了。
这里留下来为了子孙后代的利益。