Фильтровать wpf collectionviewsource в VB? - PullRequest
2 голосов
/ 13 апреля 2009

Я хочу отфильтровать источник коллекционного представления, используя фильтр, который я написал, но я не уверен, как применить фильтр к нему?

Вот мой источник просмотра коллекции:

    <Grid.Resources>
        <CollectionViewSource x:Key="myCollectionView" 
           Source="{Binding Path=Query4, Source={x:Static Application.Current}}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="ContactID" 
                                     Direction="Descending"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Grid.Resources>

Я реализовал фильтр как таковой:

    Private Sub WorkerFilter(ByVal sender As Object, ByVal e As FilterEventArgs)

    Dim value As Object = CType(e.Item, System.Data.DataRow)("StaffSection")

    If (Not value Is Nothing) And (Not value Is DBNull.Value) Then
        If (value = "Builder") Or (value = "Office Staff") Then
            e.Accepted = True

        Else

            e.Accepted = False
        End If
    End If
End Sub

Так как мне получить фильтр CollectionViewSource по фильтру при загрузке? Не могли бы вы дать мне весь необходимый мне код (только несколько строк, которые я изобразил), так как я совсем новичок в кодировании.

Спасибо, ребята

РЕДАКТИРОВАТЬ: Для записи,

  <CollectionViewSource x:Key="myCollectionView" Filter="WorkerFilter" ... />

выдает ошибку:

Ошибка инициализации объекта (ISupportInitialize.EndInit). 'System.Windows.Data.BindingListCollectionView' представление не поддерживает фильтрацию. Ошибка в объекте myCollectionView

Ответы [ 3 ]

1 голос
/ 06 декабря 2012

Я относительно новичок в WPF Coding awswell. Вот что я предлагаю вам попробовать:

Создайте функцию фильтра следующим образом:

Public Function FilterList(item As Object) As Boolean
        Dim value as Object = item
        If (Not value Is Nothing) And (Not value Is DBNull.Value) Then
        If (value = "Builder") Or (value = "Office Staff") Then
            Return True

        Else

            Return False
        End If
    End If
End Function

Вызовите функцию из вашего события Window_Loaded:

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles MainWindow.Loaded
    MyCollectionView = CollectionViewSource.GetDefaultView(Query4) 'May not be needed, IDK
    MyCollectionView.Filter = New Predicate(Of Object)(AddressOf FilterList)
End Sub

Дайте мне знать, если это не сработает (возможно, потребуется некоторая корректировка: D)

0 голосов
/ 10 декабря 2009

У меня была такая же проблема, пока я не решил сделать следующее и хорошо работает, я не знаю, какие минусы:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:System.Windows.Data;assembly=PresentationFramework">

    <CollectionViewSource
    x:Key="FilteredBindingListCollection"
    CollectionViewType="{x:Type data:ListCollectionView}" />

</Window>

Надеюсь, это было полезно.

0 голосов
/ 13 апреля 2009

Вам просто нужно прикрепить событие в XAML:

<CollectionViewSource x:Key="myCollectionView" Filter="WorkerFilter" ...>
...