如何过滤List属性

时间:2017-07-28 01:32:26

标签: c# linq uwp

在我的视图上我有一个AutoSuggestBox(searchfield)和ListView,我的ListView的ItemSource被绑定到我的VM Class属性:

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上输入 test 并点击回车时,过滤项目的最简单方法是什么(item.description == searchterm)? 只是过滤它并更新itemsource,而不是重写属性

1 个答案:

答案 0 :(得分: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();
}