2017-07-28 117 views
1

在我查看我有一个AutoSuggestBox(searchfield)和ListView,我的ListView的的ItemSource为界,我的VM类属性:如何过滤列表属性

private Class1 _searchMatches; 
public Class1 SearchMatches { 
    get { return _searchMatches; } 
    set { this.Set(ref _searchMatches, value); } 
} 

在我的Class1我有一个LoadItems任务:

异步任务> LoadItems()

var stocks = _response.products? 
       .Select(s => new MyClass(PLService.DtoToModel(s))) 
       .ToList(); 
     var items = stocks.GroupBy(p => p.productModel.Description) 
           .Select(p => p.First()) 
           .ToList(); 
     return items; 

当我在AutoSuggestBox键入测试并回车,什么是筛选项目,其中最简单的方法(item.description == searchterm)? 只是过滤它并更新itemsource,而不是重写属性

+0

为什么不能在过滤器的过滤器的数据源,并应用其结果作为ListView的数据源? –

+0

你能提供代码吗? – NicoTing

+0

如果股票是一个ObservableCollection,那么你需要将它复制到一个临时变量清除原始集合,然后将过滤后的项目重新添加到源observable集合中。 –

回答

3

您可以使用<SearchBox>和它的QuerySubmitted事件。但它也可以与<TextBox>一起使用。 如果您需要替换器您的Items - 只需创建两个列表,一个用于存储您的Items,另一个用于显示项目。

这里是一个<SearchBox>样本:

private List<MyClass> _items; // store for your items 

private List<MyClass> _displayItems; 
public List<MyClass> DisplayItems // list to show 
{ 
    get { return _displayItems; } 
    set { SetProperty(ref _displayItems, value); } 
} 

private void SearchBoxQuerySubmitted(SearchBoxQuerySubmittedEventArgs eventArgs) 
{ 
    searchTerm = eventArgs.QueryText?.Trim(); 
    Filter(searchTerm); 
} 

private void Filter(string searchTerm) 
{ 
    if (_items == null) 
     return; 

    IQueryable<MyClass> items = _items.AsQueryable(); 

    if (!string.IsNullOrEmpty(searchTerm)) 
    { 
     searchTerm = searchTerm.ToLower(); 
     items = items.Where(x => x.productModel.Description.ToLower().Contains(searchTerm)); 
    } 

    DisplayItems = items.ToList(); 
} 
+0

对不起,但我使用autosuggest所以有querrysubmitted,但我能够恢复旧项目,我的意思是如果我的班级计数是20,然后筛选后成为7,当搜索其他searchterm,它会搜索20物品而不是过滤的物品? – NicoTing

+0

是的,它会搜索20个项目,因为你查询并创建新列表,它不会改变原来的'_items' – ashchuk

+0

好的谢谢,让我试试以后 – NicoTing