我遇到一个问题,即在用户的每次按键时,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
内的代码似乎等待重置事件。
答案 0 :(得分:1)
由于没有人在这里或在MvvmCross Xamarin Slack频道上回答,我最终自己发现了解决方案。
重新创建绑定到ItemsSource
的列表导致了有问题的奇怪行为。
ObservableCollection
与Clear()/Add()
而不是重新创建确实是要走的路。上一个问题段落中描述的卡住行为(等待重置事件)是由于没有正确的线程调度(我的应用程序是多线程的)。
只要我的observable集合包含一个始终在UI线程上引发CollectionChanged
事件的代理集合,问题就会消失。
离开这里为了后代的利益。