2009-07-06 11 views
2

Comment redimensionner correctement la barre de défilement lorsque la collection sous-jacente d'un WPF ListView change?Comment redimensionner correctement la barre de défilement lorsque la collection sous-jacente d'un WPF ListView change?

J'ai un ListView WPF lié à une collection observable avec plusieurs milliers d'éléments. Quand un grand nombre d'entre eux sont supprimés, la vue semble ne montrer que le dernier élément. Lorsque je déplace la position dans la vue avec la barre de la souris, la barre de raccourcissement est redimensionnée pour refléter la nouvelle taille de la collection. Est-il possible de forcer la barre ListView et Scroll à se synchroniser lorsque la collection change?

Répondre

2

J'ai trouvé une solution de rechange si quelqu'un d'autre a ce problème.

L'exemple de code suivant montre la source d'éléments de l'amélioration ListView modifiée sur la première ligne. Les lignes suivantes montrent la solution de contournement qui consiste simplement à revenir au premier élément.

this.ListViewResults.ItemsSource = this.itemsFiltered; 

object firstItem = this.ListViewResults.Items.GetItemAt(0); 

if(firstItem == null) 
{ 
    return; 
} 

this.ListViewResults.ScrollIntoView(firstItem); 
+0

Cela fonctionne parfaitement! Définissez votre datasource/itemssource, trouvez la première ligne et faites défiler jusqu'à celle-ci! –

+0

Avez-vous eu le même problème? Je n'ai pas trouvé beaucoup de cas où d'autres personnes avaient vu cela. –

0

Comportement étrange !!

Je voudrais essayer de définir le contexte de liaison (Context) de la ListView à null, puis à nouveau la même liste afin d'actualiser les liaisons.

+0

Non, cela ne semble pas fonctionner. J'ai essayé de définir 'MyListView.DataContext' à la fois' null' et un ensemble de données vide. –

0

J'ai une solution différente qui nécessite de sous-classer ListView. C'est un peu plus de travail mais le résultat est meilleur que de simplement faire défiler le premier élément. Mais vous devrez adapter le modèle ListView de sorte que le ScrollViewer dans le modèle ait un nom (ici PART_ScrollViewer) ou que vous utilisiez un autre moyen pour obtenir l'objet ScrollViewer.

public class BetterListView : ListView 
{ 
    ScrollViewer sv; 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     //Get the scrollviewer in the template (I adapted the ListView template such that the ScrollViewer has a name property) 
     sv = (this.Template.FindName("PART_ScrollViewer", this)) as ScrollViewer; 
    } 

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) 
    { 
     base.OnItemsChanged(e); 
     //Prevent the bug where the ListView doesn't scroll correctly when a lot of items are removed 
     if (sv != null && e.Action == NotifyCollectionChangedAction.Remove) 
     { 
      sv.InvalidateScrollInfo(); 
     } 
    } 
} 
+0

Salut, j'ai essayé cette méthode, mais this.Template.FindName ("PART_ScrollViewer", this) retourne null. – VHanded

Questions connexes