最简单的答案是使用CollectionViewSource(CVS)来包含您的集合,并将列表框绑定到CVS。 CVS可以执行过滤器,排序和组,而不会影响收集。
代码隐藏方法
从本质上讲,你将有一个事件处理程序,它告诉CVS执行新的过滤器为代表。矿通常是这个样子:
Private Sub MyEventHandler()
_ShipmentCollectionView.Filter = New Predicate(Of Object)(AddressOf FilterOut)
End Sub
Private Function FilterOut(ByVal item As Object) As Boolean
Dim MyShipment As Shipment = CType(item, Shipment)
If _FilterDelivered And MyShipment.TransitStatus = eTransitStatus.Delivered Then
Return False
End If
If _FilterOverdue And MyShipment.TransitStatus = eTransitStatus.InTransit AndAlso MyShipment.ExpectedDate < Today Then
Return False
End If
If _FilterUnshipped And MyShipment.TransitStatus = eTransitStatus.Unshipped Then
Return False
End If
If SearchString Is Nothing Or SearchString = "" Then
Return True
Else
Return MyShipment.Contains(SearchString)
End If
End Function
这样做是通过FilterOut方法传递物品,并返回它们是否符合过滤器。如果他们这样做,CollectionView(或CVS所属的部分)会告知UI要显示哪些项目。
的MVVM方法
(我的收藏夹)
此方法中,所有的过滤器选项控制不同绑定到视图模型的特性。我最喜欢做的事情是在SearchText属性设置器中放置_ShipmentCollectionView.Filter = New Predicate(Of Object)(AddressOf FilterOut)行。这样,每当用户输入一个字母(连续过滤)时,就会运行过滤器操作,即假设他们已经正确地进行了绑定(即Text =“{Binding SearchString,UpdateSourceTrigger = PropertyChanged}”)
就我个人而言,推荐MVVM模式,但最简单的项目除外。它允许用更少的麻烦完成更多更简洁的工作。
希望有所帮助。
链接!
两个伟大的,很好地解释选项。这是我在相当一段时间内进行的第一个WPF项目;我忘记了关于CollectionViewSource的所有信息!这些东西非常方便。非常感谢你。 – Patrick
高兴,这是有帮助! – CodeWarrior