从 ViewModel 中的列表中搜索(Xamarin Android)
Search from List which is in ViewModel (Xamarin Android )
我是 Xamarin Android 开发的新手,我正在使用 MvvmCross 进行绑定 data.I 有 SerachView on action-bar.I 想从 ViewModel.How 中的列表中搜索数据,我可以实现吗?我在互联网上搜索过这个问题,但都使用了适配器,我想在不使用来自 ViewModel.I 的适配器的情况下搜索列表项我不知道如何做 that.So 任何人都可以建议我一个简单的方法?
如有任何建议或建议,我们将不胜感激。
很简单。
您的 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
,所以你需要做这里描述的事情:
最简单的方法可能是简单地实现 SearchView.IOnQueryTextListener
接口,并在其中设置您在 ViewModel
.
的实现中收到的新字符串
我是 Xamarin Android 开发的新手,我正在使用 MvvmCross 进行绑定 data.I 有 SerachView on action-bar.I 想从 ViewModel.How 中的列表中搜索数据,我可以实现吗?我在互联网上搜索过这个问题,但都使用了适配器,我想在不使用来自 ViewModel.I 的适配器的情况下搜索列表项我不知道如何做 that.So 任何人都可以建议我一个简单的方法?
如有任何建议或建议,我们将不胜感激。
很简单。
您的 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
,所以你需要做这里描述的事情:
最简单的方法可能是简单地实现 SearchView.IOnQueryTextListener
接口,并在其中设置您在 ViewModel
.