2012-12-08 45 views
2

我目前有一個GridView,其中ItemsSource被設置爲ObservableCollection。底層數據的更新會在用戶界面中反映出來,而不需要我付出任何努力。事情運作良好。在Windows 8中過濾GridView

將過濾器應用於ObservableCollection以使只顯示某些項目的最簡潔方法是什麼?理想情況下,我不想實際從ObservableCollection中刪除項目,也不想保留兩個不同的集合,因爲它會使事物保持同步更具挑戰性。 CollectionViewSource看起來很有前途,但Windows Store應用程序實現似乎缺少過濾功能(爲什麼MS ????)。

回答

0

Asuming你使用某種模板MVVM的,使用LINQ:

this.DefaultViewModel["GreaterThan10Items"] = originalList.Where(c => c.SomeProperty > 10) 
    .Select(c => new {c.SomeProperty, c.OtherProperty}); 

或許:

this.DefaultViewModel["Children"] = from query in originalList 
            where query.age <10 
            select new Person 
            { 
             age= query.age, 
             name = query.Name 
            }; 

當然,ItemViewSource必須與GreaterThan10Items和你的GridView綁定到該ItemViewSource

1

我剛剛在我自己的C#+ XAML Windows 8應用程序中處理了這個相同的問題。這三個開源項目中的任何一個都會爲您提供您所追求的功能:Bindable LINQObticsContinuous LINQ

CollectionViewSource不包含Windows 8中的過濾功能,因爲無論如何,最好將這些功能放入View Model。這樣做的主要優點是,打包爲可移植類庫(PCL)後,您的View Model(包括篩選)將可以在WPF,Silverlight和Windows 8項目中移植。

雖然上面的三個開源項目看起來很有趣,但我通過構建自己的MVVM framework來完成這項任務。我的框架已經支持排序,所以過濾是一個自然的增加。在使用我上個月實施的Reactive API時,添加它很容易。我還沒有上傳包含過濾功能的MVVM框架的最新版本。如果上述三個開源項目都不適合您,請告訴我,以便我可以儘快上傳。