最簡單的答案是使用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