过滤ObservableCollection

时间:2011-09-05 20:45:19

标签: c# .net silverlight windows-phone-7

我对编码非常陌生,正在尝试学习Windows手机的代码。自上周以来我遇到了一个问题,这让我发疯了。

我的ObservableCollection定义如下:

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

Note类中有两个变量名为IndexCategory

我想过滤ObservableCollection,以便我可以从中选择一个特定元素。

这样做有简单的方法吗?任何帮助将非常感谢!

5 个答案:

答案 0 :(得分:4)

你可以这样做:

var myCollection = GetNoteCollection(...);

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

答案 1 :(得分:3)

更新:这些课程已不再可用,请查看ObservableCollectionView

原始答案
请尝试以下其中一个类:OrderedObservableCollectionFilteredObservableCollection

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

FilteredList仅包含年龄≥1岁的人,所有人都按年龄排序。如果FilteredList中的内容发生变化,OriginalList将自动更新。如果OriginalList是全局的并且页面上使用了FilteredList,则必须调用FilteredList.Unload()来删除事件绑定 - 这需要垃圾收集器释放FilteredList

这些课程未经全面测试,如果您发现问题,请在此处报告。

顺便说一句:我对Unload()方法不满意。是否可以添加类似弱事件引用的内容?

答案 2 :(得分:2)

你没有说你要过滤它的内容。但无论如何,请查看LINQ Enumerable.WhereEnumerable.FirstOrDefault

示例:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我认为您应该将 ListCollectionView 列表&lt;&gt; ObservableCollection 属性一起使用:

将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;