【问题标题】:Filter out results in a collection without removing them from the collection过滤出集合中的结果而不将它们从集合中删除
【发布时间】:2017-03-15 15:52:21
【问题描述】:

我有一个过滤器,可以过滤掉ObservableCollection 中的项目,这样只有集合中的某些项目会显示在我的数据网格中。 OC 称为 MyTruckCollection

我可以过滤掉结果的唯一方法是删除我不想要的项目,只添加我想要的项目。 (我无法隐藏集合中的某些项目)

示例:

var filteredList = MyTruckCollection.Where(x => x.TruckStatus == filterValue).ToList();
MyTruckCollection.Clear();
foreach (var filteredItem in filteredList)
    MyTruckCollection.Add(filteredItem);

现在我的问题是我不想从列表中删除我不想要的项目,因为当我添加另一个过滤器时,集合只包含前一个过滤器添加的项目。所以我收藏的项目列表随着我添加的每个过滤器而变得越来越小。

所以问题是:有没有办法过滤掉我的 OC 中的某些项目而不删除它们,并且仍然更新我的数据网格的 UI。

我也可以这样做:

dgMyTruckCollection.ItemSource = MyTruckCollection.Where(x => x.TruckStatus == filterValue);

但是,如果我想对其应用 排序 功能并且 UI 不会更新,我会失去对我的集合的访问权限。我对 MVVM 不太了解,也不太了解,请问有人可以帮助我吗?

【问题讨论】:

  • 你可以使用 CollectionView (wpftutorial.net/DataViews.html)
  • 为什么你是 MyTruckCollection.Clear();什么时候想重用集合?
  • @mybirthname 否则我添加的项目将被添加多次,我不希望在集合中重复。还是有更好的方法?
  • 将 FilteredTruckCollection 属性添加到视图模型并填充它而不是重复使用 MyTruckCollection
  • 在项目的可见属性上使用Converter

标签: c# wpf datagrid observablecollection


【解决方案1】:

您可以使用ICollectionView 接口进行过滤/排序任务。会是这样的

ICollectionView MyTruckCollectionView= CollectionViewSource.GetDefaultView(MyTruckCollection);
MyTruckCollectionView.Filter = o => ((Truck)o).TruckStatus==filterValue
MyTruckCollectionView.SortDescriptions.Add(new SortDescription("field", ListSortDirection.Ascending));
....

【讨论】:

  • 非常感谢该示例正常运行。 :)
【解决方案2】:

您可以使 MyTruckCollection 成为一个 get-only 属性,当调用包含所有值的私有 myTruckCollection 时,该属性会应用活动过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2012-04-27
    • 2010-11-08
    相关资源
    最近更新 更多