从ViewModel中的列表中搜索(Xamarin Android)

时间:2015-10-20 05:04:59

标签: android xamarin mvvmcross searchview

我是Xamarin Android Development的新手,我正在使用 MvvmCross 来绑定数据。我在action-bar上有 SerachView 。我想从列表中搜索数据在ViewModel中。我可以实现吗?我在互联网上搜索过这个问题,但都使用了适配器,我想在不使用ViewModel的适配器的情况下搜索列表项。我不知道怎么做。所以有人能建议我一个简单的方法吗?

任何建议或意见将不胜感激。

1 个答案:

答案 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的实施中收到的新字符串。