过滤ObservableCollection

7
我是一个很新的编程者,正在学习为Windows手机编写代码。我在过去的一周中遇到了一个问题,让我感到非常困扰。
我有一个如下所示定义的ObservableCollection:
public ObservableCollection<Note> Items { get; private set; }

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

我想要筛选ObservableCollection以便从中选择特定的元素。

有没有简单的方法可以做到这一点?任何帮助将不胜感激!


顺便提一下,它们不是“变量”(变量是局部于方法的),它们很可能是属性或字段。 - AnthonyWJones
5个回答

8

您可以做以下事情:

var myCollection = GetNoteCollection(...);

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

6

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

原始回答
尝试使用以下其中一个类:OrderedObservableCollectionFilteredObservableCollection

OriginalList = new ObservableCollection<Person>();
FilteredList = new OrderedObservableCollection<Person, int>(originalList, p => p.Age, a => a.Age >= 18);
< p > FilteredList 包含年龄>= 18的人,并按年龄排序。如果在OriginalList中发生更改,则FilteredList将自动更新。如果OriginalList是全局的,而FilteredList在页面上使用,则必须调用FilteredList.Unload()以删除事件绑定 - 这是需要垃圾收集器可以释放FilteredList

这些类没有完全测试,如果您发现问题,请在此处报告。

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


你可能想要更新你的GitHub页面链接,因为CodePlex即将关闭。此外,我的第一印象是你在指出现有的.NET类,但这些都是你自己发布的工具包(我假设是基于GitHub账户名)。为了充分披露,你可能还想在回答中提到这一点。 - tehDorf

2
你没有说你想按什么过滤。但是无论如何,请查看LINQ的Enumerable.WhereEnumerable.FirstOrDefault
示例:
var answerToLifeTheUniverseAndEverything = Items.FirstOrDefault(note => note.Index == 42)

但是我一直收到一个错误,即“FirstOrDefault”和“Where”都未定义。顺便问一下,我可以包含两个搜索参数,例如index==1 && category==2吗? - Gowtham
当然,你需要在你的using语句中包含System.Linq。是的,你可以有多个搜索参数(布尔语句)。 - Claus Jørgensen

1
I think you should use ListCollectionView and List<> with your ObservableCollection property.
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;

1

我认为你想要使用的是CollectViewSource。这些在Windows Phone 7.1中得到支持。 你可以创建它,将你的ObservableCollection包装起来,并将其设置为ViewModel中可绑定的属性。 我即将尝试它。如果你想知道我的进展,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接