我对编码非常陌生,正在尝试学习Windows手机的代码。自上周以来我遇到了一个问题,这让我发疯了。
我的ObservableCollection
定义如下:
public ObservableCollection<Note> Items { get; private set; }
Note
类中有两个变量名为Index
和Category
。
我想过滤ObservableCollection
,以便我可以从中选择一个特定元素。
这样做有简单的方法吗?任何帮助将非常感谢!
答案 0 :(得分:4)
你可以这样做:
var myCollection = GetNoteCollection(...);
var result = myCollection.Where(w => w.Category.Equals("MyCategory"));
答案 1 :(得分:3)
更新:这些课程已不再可用,请查看ObservableCollectionView
原始答案
请尝试以下其中一个类:OrderedObservableCollection
或FilteredObservableCollection
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.Where和Enumerable.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;