我是Xamarin Android Development的新手,我正在使用 MvvmCross 来绑定数据。我在action-bar上有 SerachView 。我想从列表中搜索数据在ViewModel中。我可以实现吗?我在互联网上搜索过这个问题,但都使用了适配器,我想在不使用ViewModel的适配器的情况下搜索列表项。我不知道怎么做。所以有人能建议我一个简单的方法吗?
任何建议或意见将不胜感激。
答案 0 :(得分:7)
这很简单。
您的SearchView
绑定到您用于过滤的字符串属性。在这里,我假设它被称为SearchQuery
。
目前尚不清楚要用于过滤的标准,我将假设ViewModel具有Name
属性,其中SearchQuery
将包含在该名称中。
所以你的ViewModel看起来像是:
public class SearchViewModel : MvxViewModel
{
public string SearchQuery
{
get { return _searchQuery; }
set {
_searchQuery = value;
RaisePropertyChanged(() => SearchQuery);
RaisePropertyChanged(() => FilteredResults);
}
}
public List<ListItemViewModel> UnfilteredResults
{
get { return _unfilteredResults; }
set {
_unfilteredResults = value;
RaisePropertyChanged(() => UnfilteredResults);
RaisePropertyChanged(() => FilteredResults);
}
}
public List<ListItemViewModel> FilteredResults
{
get
{
if (string.IsNullOrEmpty(SearchQuery))
return UnfilteredResults;
return UnfilteredResults
.Where(r => r.Name.Contains(SearchQuery)).ToList();
}
}
}
所以,无论何时在搜索框中输入新值,它都会在FilteredResults
上触发PropertyChanged事件,并使用简单的LINQ查询来过滤结果。
如果您不想每次换出整个列表,可以使用ObservableCollection执行此操作,并在其中添加和删除项目。
修改强>
如上所述,您只需将MvxListView
绑定到新项目源。假设您正在为视图使用AXML布局:
<MvxListView
..
local:MvxBind="ItemsSource FilteredResults; ItemClick ResultClickedCommand" />
对于SearchView
,我只是看,MvvmCross中似乎没有任何代码可以轻松绑定到它,并且它不会从EditText
继承,所以你需要做点什么如下所述:https://stackoverflow.com/a/22501906/368379
最简单的方法可能只是实现SearchView.IOnQueryTextListener
界面,并在其中设置您在ViewModel
的实施中收到的新字符串。