2011-09-05 61 views
4

我對編碼非常陌生,並且正在努力學習如何編寫Windows phone。自上週以來,我陷入了一個問題,這讓我瘋狂。Filter ObservableCollection

我有一個這樣定義的ObservableCollection

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

Note類有兩個變量,它叫IndexCategory

我想過濾ObservableCollection,以便我可以從中選擇一個特定的元素。

有沒有簡單的方法做到這一點?任何幫助將不勝感激!

+0

修正標籤:) – Gowtham

+0

BTW @Davide感謝,他們不是「變量」(變量當地的一種方法),它們是屬性或字段最有可能的屬性。 – AnthonyWJones

回答

3

你可以這樣做:

var myCollection = GetNoteCollection(...); 

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

非常感謝大衛和克勞斯。我試過這樣做.. – Gowtham

2

你不是說你要過濾它是什麼。但無論如何,看看LINQs Enumerable.WhereEnumerable.FirstOrDefault

例子:

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

但是..我不斷收到一個錯誤,「FirstOrDefault」和「Where」都沒有定義。順便說一下,我可以包含兩個搜索參數,如索引== 1 &&類別== 2 ?? – Gowtham

+0

當然你需要在你的using語句中包含System.Linq。是的,您可以擁有儘可能多的搜索參數(布爾語句)。 –

3

更新:這些類不再可用,請ObservableCollectionView

原來的答案
嘗試其中之一分類:OrderedObservableCollectionFilteredObservableCollection

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

FilteredList只包含年齡≥18歲的人,所有人都按年齡分類。 FilteredList將自動更新,如果OriginalList更改。如果OriginalList是全局的並且在頁面上使用了FilteredList,則必須調用FilteredList.Unload()以刪除事件綁定 - 垃圾回收器可以釋放FilteredList,這是必需的。

這些類沒有完全測試,如果您發現問題,請在此處報告。

順便說一句:我不喜歡Unload()方法。是否有可能添加像弱事件引用?

+0

您現在可能希望將該鏈接更新到您的GitHub頁面,此時CodePlex正在關閉。另外,我的第一印象是你指出了現有的.NET類,但是這些來自你自己發佈的工具包(我假設,基於GitHub帳戶名)。您也可以在您的回答中提及,以便完整披露。 – tehDorf

1

我認爲你要使用的是一個CollectViewSource。這些在Windows Phone 7.1中受支持。 您可以創建它,包裝您的ObservableCollection並將其設置爲ViewModel中的可綁定屬性。 我即將自己嘗試。如果你想知道我如何讓我知道。

0

我認爲你應該使用的ListCollectionView名單<>的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-給予項目屬性的濾波值:

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;