Filter ObservableCollection
本文关键字:ObservableCollection Filter | 更新日期: 2023-09-27 18:07:45
我对编码很陌生,正在努力学习为Windows phone编写代码。从上周开始我就被一个问题困住了,快把我逼疯了。
我有一个这样定义的ObservableCollection
:
public ObservableCollection<Note> Items { get; private set; }
Note
类中有两个变量分别为Index
和Category
。
我想过滤ObservableCollection
,这样我就可以从中选择一个特定的元素。
有简单的方法吗?任何帮助将非常感激!
你可以这样做:
var myCollection = GetNoteCollection(...);
var result = myCollection.Where(w => w.Category.Equals("MyCategory"));
更新:这些类不再可用,查看ObservableCollectionView
原始答案
试试这些类:OrderedObservableCollection
或FilteredObservableCollection
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中的一个可绑定属性。我自己也要试试。如果你想知道我过得怎么样,请告诉我。
我认为你应该使用ListCollectionView和List<>与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;