Filter ObservableCollection

本文关键字:ObservableCollection Filter | 更新日期: 2023-09-27 18:07:45

我对编码很陌生,正在努力学习为Windows phone编写代码。从上周开始我就被一个问题困住了,快把我逼疯了。

我有一个这样定义的ObservableCollection:

public ObservableCollection<Note> Items { get; private set; }

Note类中有两个变量分别为IndexCategory

我想过滤ObservableCollection,这样我就可以从中选择一个特定的元素。

有简单的方法吗?任何帮助将非常感激!

Filter ObservableCollection

你可以这样做:

var myCollection = GetNoteCollection(...);
var result = myCollection.Where(w => w.Category.Equals("MyCategory"));

更新:这些类不再可用,查看ObservableCollectionView

原始答案
试试这些类:OrderedObservableCollectionFilteredObservableCollection

OriginalList = new ObservableCollection<Person>();
FilteredList = new OrderedObservableCollection<Person, int>(originalList, p => p.Age, a => a.Age >= 18);

FilteredList只包含年龄>= 18的人,所有的人都按年龄排序。如果OriginalList发生变化,FilteredList将自动更新。如果OriginalList是全局的,而FilteredList在页面上使用,则必须调用FilteredList.Unload()来删除事件绑定——这是垃圾收集器释放FilteredList所必需的。

这些类没有完全测试过,如果你发现问题,请在这里报告。

顺便说一句:我对Unload()方法不满意。是否有可能添加弱事件引用之类的东西?

你没有说你想过滤它。但不管怎样,看看LINQs Enumerable。Where和Enumerable。FirstOrDefault

的例子:

var answerToLifeTheUniverseAndEverything = Items.FirstOrDefault(note => note.Index == 42)

我认为你要使用的是一个CollectViewSource。Windows Phone 7.1支持这些功能。你可以创建它,包装你的ObservableCollection,并将它设置为ViewModel中的一个可绑定属性。我自己也要试试。如果你想知道我过得怎么样,请告诉我。

我认为你应该使用ListCollectionViewList<>ObservableCollection属性:

1-将ListCollectionView绑定到与ObservableCollection相同的数据源,如:

ListCollectionView lvs;
var note = from n in Note select n;
        lvs = new ListCollectionView(note.ToList <Note>());

2-创建过滤器方法:

public bool ItemIndexFilter(object obj)
    {
        Note note = obj as Note;
        return (note.Index>=10);
    }

3-给Items属性一个过滤值:

lvs.Filter = new Predicate<object>(ItemIndexFilter);
List<Note> note_list = new List<Note>();
for (int i = 0; i < lvs.Count; i++)
     {                   
        note_list.Add((Note)lvs.GetItemAt(i));    
     }
var observe = new ObservableCollection<Note>(note_list);
items=observe;