【问题标题】:Filtering a GridView in Windows 8在 Windows 8 中过滤 GridView
【发布时间】:2012-12-08 18:40:44
【问题描述】:
我目前有一个 GridView,其中 ItemsSource 设置为 ObservableCollection。对基础数据的更新会反映在 UI 中,而我无需付出任何努力。事情进展顺利。
对 ObservableCollection 应用过滤器以便只显示某些项目的最简洁的方法是什么?理想情况下,我不想实际从 ObservableCollection 中删除项目,也不想维护两个不同的集合,因为这会使保持同步更具挑战性。 CollectionViewSource 看起来很有希望,但 Windows Store App 实现似乎缺乏过滤功能(为什么是 MS????)。
【问题讨论】:
标签:
xaml
windows-8
winrt-xaml
【解决方案1】:
我刚刚在自己的 C# + XAML Windows 8 应用程序中解决了同样的问题。这三个开源项目中的任何一个都将为您提供您所追求的功能:Bindable LINQ、Obtics 和 Continuous LINQ。
CollectionViewSource 不包括 Windows 8 中的过滤功能也很好,因为无论如何最好将此类功能放入视图模型中。这样做的主要优点是,打包为可移植类库 (PCL),您的视图模型(包括过滤)将可移植到您的 WPF、Silverlight 和 Windows 8 项目中。
虽然上述三个开源项目对我来说看起来很有趣,但我通过在自己的 MVVM framework 之上构建来完成这项任务。我的框架已经支持排序,所以过滤是一个自然的补充。使用我上个月实现的Reactive API 时添加它很容易。我尚未上传包含过滤的 MVVM 框架的最新版本。如果以上三个开源项目都不适合你,请告诉我,这样我可以尽快上传。
【解决方案2】:
假设您正在使用某种 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
【解决方案3】:
您可以使用我的ObservableComputations 库。例如,如果您希望按特定类型订单过滤的 bing 到 GridView:
GridView.ItemsSource = OrdersObservableCollection
.Filtering(o => o.Type == OrdersFilter.SelectedType)
现在,当 OrdersObservableCollection 更改或 Order.Type 属性更改时,GridView 会自动刷新。确保 Oreder 类实现 INotifyPropertyChanged。