2009-04-13 10 views
2

Je veux filtrer une collectionviewsource en utilisant un filtre que j'ai écrit, mais je ne suis pas sûr de savoir comment je peux y appliquer le filtre?Filtrer une wpf collectionviewsource dans VB?

Voici mon point de vue collection source:

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

J'ai mis en place un filtre en tant que tel:

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 

Alors, comment puis-je obtenir le CollectionViewSource filtré par le filtre de la charge? Pourriez-vous s'il vous plait donner tout le code dont j'ai besoin (quelques lignes seulement) car je ne suis pas habitué au codage.

Merci les gars

EDIT: Pour mémoire,

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

me donne l'erreur:

Failed object initialization (ISupportInitialize.EndInit). 'System.Windows.Data.BindingListCollectionView' view does not support filtering. Error at object 'myCollectionView'

Répondre

0

Vous devez juste besoin de joindre l'événement dans le XAML:

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

Merci, mais quand j'essaie que je reçois l'erreur suivante: Échec de l'initialisation de l'objet (ISupportInitialize.EndInit). La vue 'System.Windows.Data.BindingListCollectionView' ne prend pas en charge le filtrage. Erreur sur l'objet 'myCollectionView' –

+0

La source de votre CollectionView ne prend pas en charge le filtrage car elle est basée sur une BindingList. Je ne suis pas sûr pourquoi BindingList ne supporte pas le filtrage, mais une vieille liste simple fait. Essayez de modifier votre source à une liste plutôt que BindingList . –

+0

Uuuhhh .... désolé, je ne suis pas sûr de ce que je ferais à ce sujet. Je suppose que "Source =" {Binding Path = Query4, Source = {x: Application statique.Current}} "" est ma liste de liaison? Cela fait référence à une base de données appelée Query4. Comment pourrais-je transformer cela en une liste ordinaire? merci –

0

J'avais la même question, jusqu'à ce que je décide de faire ce qui suit et fonctionne bien, je Donno ce que les inconvénients sont:

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

espoir cela a été utile.

1

Je suis relativement nouveau à WPF Coding awswell. Voici ce que je vous suggère d'essayer:

Faire une fonction de filtre comme suit:

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 

Appelez la fonction de votre événement 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 

Laissez-moi savoir si cela ne fonctionne pas (Peut avoir besoin d'ajustement: D) ​​