在VB中过滤wpf collectionviewsource?

时间:2009-04-13 15:55:23

标签: wpf vb.net filtering collections

我想使用我编写的过滤器过滤一个collectionviewsource,但我不确定如何将过滤器应用到它?

这是我的收藏视图来源:

    <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 个答案:

答案 0 :(得分:1)

我对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)

答案 1 :(得分:0)

您只需要在XAML中附加事件:

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

答案 2 :(得分:0)

我有同样的问题,直到我决定做以下事情并且运作良好,我不知道缺点是什么:

<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>

希望这有用。