Введите CollectinViewSource
Одна вещь, которую вы можете сделать, это подключить ваш ListBox к вашим элементам через CollectionViewSource.
Что вы делаете, это создаете collectionViewSource в XAML:
<Window.Resources>
<CollectionViewSource x:Key="cvsItems"/>
</Window.Resources>
Подключитесь к нему в вашем CodeBehind или ViewModel
Dim cvsItems as CollectionViewSource
cvsItems = MyWindow.FindResource("cvsItems")
и установите его свойство source для вашей коллекции элементов.
cvsItems.Source = MyItemCollection
Затем вы можете выполнить фильтрацию по нему.CollectionViewSource поддерживает все элементы в коллекции, но изменяет представление этих элементов в зависимости от того, что вы ему сообщаете.
Фильтрация
Чтобы отфильтровать, создайте CollectionView с помощью CollectionViewSource:
Dim MyCollectionView as CollectionView = cvsItems.View
Далее напишите функцию фильтрации:
Private Function FilterDeleted(ByVal item As Object) As Boolean
Dim MyObj = CType(item, MyObjectType)
If MyObj.Deleted = True Then Return False Else Return True End If
End Function
Наконец, напишите что-то, что заставляет волшебство произойти:
MyCollectionView .Filter = New Predicate(Of Object)(AddressOf FilterDeleted)
У меня обычно есть флажки или кнопки Radiobutton в скрытомрасширитель, который позволяет мне изменять параметры фильтрации назад и вперед.Они связаны со свойствами, каждое из которых выполняет функцию фильтра, которая оценивает все фильтры и затем возвращает, должен ли элемент появляться или нет.
Дайте мне знать, если это работает для вас.
Редактировать:
Я почти забыл:
<ListBox ItemsSource="{Binding Source={StaticResource cvsItems}}"/>