在Windows 8中过滤GridView

时间:2012-12-08 18:40:45

标签: xaml windows-8 winrt-xaml

我目前有一个GridView,其中ItemsSource设置为ObservableCollection。基础数据的更新反映在UI中,而不需要我做任何努力。事情进展顺利。

将过滤器应用于ObservableCollection的最简洁方法是什么,以便只显示某些项目?理想情况下,我不想实际从ObservableCollection中删除项目,也不想维护两个不同的集合,因为它会使事物保持同步更具挑战性。 CollectionViewSource看起来很有前景,但Windows Store App实现似乎缺乏过滤功能(为什么MS ????)。

3 个答案:

答案 0 :(得分:1)

我刚刚在自己的C#+ XAML Windows 8应用程序中处理了同样的问题。这三个开源项目中的任何一个都将为您提供您所需的功能:Bindable LINQObticsContinuous LINQ

同样,CollectionViewSource不包含Windows 8中的过滤功能,因为最好将这些功能放入View Model中。这样做的主要优点是,打包为可移植类库(PCL),您的视图模型(包括过滤)将可以在您的WPF,Silverlight和Windows 8项目中移植。

虽然以上三个开源项目看起来很有趣,但我在自己的MVVM framework之上构建了这项任务。我的框架已经支持排序,因此过滤是一个自然的补充。使用我上个月实施的Reactive API时,添加它很容易。我还没有上传我的MVVM框架的最新版本,其中包括过滤。如果以上三个开源项目都不适合你,请告诉我,所以我可以更快地上传一下。

答案 1 :(得分:0)

假设你正在使用模板的某种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

答案 2 :(得分:0)

您可以使用我的ObservableComputations库。例如,如果要按特定类型将bing过滤到GridView:

GridView.ItemsSource = OrdersObservableCollection
    .Filtering(o => o.Type == OrdersFilter.SelectedType)

现在,当OrdersObservableCollection更改或Order.Type属性更改时,GridView将自动刷新。确保Oreder类实现INotifyPropertyChanged。