2009-07-06 13 views
2

Wie wird die Bildlaufleiste korrekt angepasst, wenn sich die zugrunde liegende Auflistung einer WPF-ListView ändert?Wie wird die Bildlaufleiste korrekt angepasst, wenn sich die zugrunde liegende Auflistung einer WPF-ListView ändert?

Ich habe eine WPF ListView an eine beobachtbare Sammlung mit mehreren tausend Elementen gebunden. Wenn eine große Anzahl davon entfernt wird, scheint die Ansicht nur den letzten Eintrag anzuzeigen. Wenn ich die Position in der Ansicht mit der Thumb-Leiste verschiebe, ändert sich die Größe der Daumennagelleiste entsprechend der neuen Größe der Sammlung. Ist es möglich, zu erzwingen, dass die ListView- und Scroll-Leiste synchronisiert wird, wenn sich die Auflistung ändert?

Antwort

2

Ich habe eine Problemumgehung gefunden, wenn jemand anderes dieses Problem hat.

Im folgenden Codebeispiel wird die Elementquelle der ListView-Benennung in der ersten Zeile geändert. Die folgenden Zeilen zeigen die Problemumgehung, mit der nur zum ersten Element zurückgescrollt werden kann.

this.ListViewResults.ItemsSource = this.itemsFiltered; 

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

if(firstItem == null) 
{ 
    return; 
} 

this.ListViewResults.ScrollIntoView(firstItem); 
+0

Das funktioniert perfekt! Stellen Sie Ihre Datenquelle ein, suchen Sie die erste Zeile und scrollen Sie zu ihr! –

+0

Hatten Sie das gleiche Problem? Ich konnte viele Fälle nicht finden, wo andere Leute das gesehen hatten. –

0

Seltsames Verhalten !!

Ich würde versuchen, den Bindungskontext (Context) der ListView auf null, und dann wieder die gleiche Liste, um die Bindungen zu aktualisieren.

+0

Nein, das scheint nicht zu funktionieren. Ich habe versucht, 'MyListView.DataContext' auf" null "und ein leeres Dataset zu setzen. –

0

Ich habe eine andere Problemumgehung, die ListView-Unterklasse erfordert. Es ist ein bisschen mehr Arbeit, aber das Ergebnis ist besser als nur zum ersten Gegenstand zu scrollen. Sie müssen jedoch die ListView-Vorlage so anpassen, dass der ScrollViewer in der Vorlage einen Namen (hier PART_ScrollViewer) hat oder Sie eine andere Methode zum Abrufen des ScrollViewer-Objekts verwenden.

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

Hallo, ich habe diese Methode versucht, aber this.Template.FindName ("PART_ScrollViewer", this) gibt null zurück. – VHanded

Verwandte Themen