我有一个网格,它有两种查看模式:所有项目,或只有PropertyX = A
的项目。视图基于CheckBox
切换开关。
我在对象模型层中有一个经常更新的集合副本,我想在数据层理想地将过滤器应用于它。有没有办法将过滤器应用于此集合以进行绑定,而无需创建集合的第二个副本或应用UI过滤器?
我认为我正在寻找的东西就像来自WPF的CollectionViewSource,但在WinForms中似乎没有。
据我所知,我的选择是:
某些数据层构造可以将过滤器应用于可以从数据层修改的绑定源,例如CollectionViewSource
创建我的集合的第二个副本,并在第一个集合更新时保持同步。由于添加,删除和修改项目的频率,这并不理想。
使用UI过滤器......并不理想,因为过滤器已经完成了很多特定于UI的事情,所以这个解决方案会混合控制UI和数据层之间的过滤器,并且会变得混乱。
还有别的吗?
在WinForms中是否存在类似于CollectionViewSource的内容,因此我可以使用选项#1?或者如果没有,在WinForms中处理这种场景的标准方法是什么?
应该注意PropertyX
永远不会改变它的价值。如果它是A,它总是A.所以这有帮助。
这是我到目前为止所做的事情:
public IEnumerable<MyClass> DisplayItems
{
get
{
if (SomeFlagIsChecked)
return _allItems;
return _allItems.Where(p => p.PropertyX == A);
}
}
我的问题是将DataSource设置为IEnumerable似乎无法正常工作。我不确定这是Winforms的东西,.Net 3.5的东西,还是我正在使用的第三方控件的限制(DevExpress GridView)。
我不想将其投放到.ToList()
,因为这些集合可以在几百到几千条记录之间,并且每隔几分钟就会刷新一次。理想情况下,我希望每次需要刷新时都避免创建新对象。