2010-10-19 3 views
1

En utilisant .NET 3.5, je trouve qu'un CollectionView avec un filtre ne se met pas à jour lorsque ObservableCollection (T) sous-jacent a déplacé des éléments en utilisant ObservableCollection (T) .Move. Comme un test de santé mentale, j'ai commencé avec un projet simple, un de Bea Stollnitz 'de cette page: http://bea.stollnitz.com/blog/?p=31. Le projet actuel peut être téléchargé ici: bea.stollnitz.com/files/28/FilterSample.zip. Si vous allez dans son dossier Window1.xaml et ajouter un bouton comme celui-ci:CollectionView avec filtre ne pas mettre à jour après ObservableCollection <T>. Déplacer

<StackPanel> 

     <Button Content="Blah" Click="Button_Click"/> 

puis ajoutez le gestionnaire de clic comme ceci:

 private void Button_Click(object sender, RoutedEventArgs e) { 
GreekGods src1 = this.Resources["src1"] as GreekGods; 
     src1.Move(0, 1); 
     } 

Vous verrez que appuyant sur le bouton ne résulte pas dans tout changement de la fenêtre. Toutefois, si vous commentez la ligne de code dans son constructeur:

 collectionView.Filter = new Predicate<object>(FilterOutA); 

puis appuyez sur le bouton, vous verrez les deux éléments supérieurs position de swap.

Alors, qu'est-ce qui me manque? Est-ce un bug ou est-ce que CollectionView perd cette fonctionnalité quand vous appliquez un filtre? Je peux comprendre si vous avez trié CollectionView, puis changer l'ordre sous-jacent ne changera pas l'ordre de CollectionView, mais ce n'est pas vrai ici. Ne devrait-il pas seulement avoir un filtre sur CollectionView continuer à montrer l'ordre et la mise à jour de ObservableCollection sous-jacente quand elle change?

Merci, Kevin

Répondre

1

Non, ce n'est pas un bug et fonctionne parfaitement. Voir, dans cet exemple, voici l'ordre des éléments dans la collection source:

[0] Venus
[1] Apollo
[2] Mars

Maintenant, si vous appliquez "FilterOutA", "Apollo" sera supprimé et donc la zone de liste va juste montrer:

[0] Venus
[1] Apollo < -Filtered sur
[2] Mars

Compte tenu de cela, l'appel src1.Move(0,1) va essentiellement déplacer "Venus" à l'index 1. Ainsi, dans la collection filtrée, il semblera que rien n'a changé.

[0] Apollo < -Filtered sur
[1] Venus
[2] Mars

La chose à noter ici est que la méthode Move() fonctionne sur la collection originale et non le filtre un. Essayez de changer l'opération de déplacement en src1.Move(0,2), et vous verrez la mise à jour de l'interface utilisateur.

+0

Je suis sûr que vous avez raison à ce sujet, mais malheureusement, je pense que c'est un cas de mon exemple n'étant pas construit comme mon cas réel. Je suis certain que j'ai vérifié l'état auquel vous faites référence dans mon cas réel et que cela ne s'appliquait pas. J'ai juste devancé moi-même quand j'ai trouvé cet exemple qui semblait également ne pas fonctionner. Je vais revenir à la planche à dessin et voir si je peux mettre en place un meilleur exemple (et reconfirmer que ce n'est pas ce qui se passe dans mon cas réel). Merci! –

Questions connexes