none
ICollectionView.Filter RRS feed

  • Frage

  • Hallo,

    ich habe folgende Frage: Bei einem TextBox_TextChanged-Event lasse ich meine ICollectionView neu Filtern. In der View ist eine Klasse gebunden, welche auch ein Bild (Image) besitzt. Also etwas größeres. Wenn ich nun bei jedem Tastenanschlag filtere, hängt die Anwendung bei meinen 1400 Datensätzen schon mal so 3-4 Sekunden, dann läuft es wieder, hängt wieder usw..

    Mit CollectionViewSource.Filter +=... läuft es etwas stabiler, da ich den Refresh selbst aufrufe.. Aber die eigentlich Frage lautet: Ist das normal das bei diesem "paar" Datensätzen schon solche Hänger auftreten?

    Vielen Dank im Voraus!

    Montag, 14. Januar 2013 11:57

Antworten

  • Hi,

    soweit ich weiß, wird beim Neu-Filtern bzw. Neu-Sortieren (also über CollectionView.Refresh) die Datenquelle einmal komplett geleert und dann komplett neu aufgebaut und nicht nur - wie man bei immer längeren Texten hoffen könnte - weiter eingeschränkt. In Deinem Fall werden also auch die 1400 (bzw. gefilterten) Bilder bei jedem getippten Zeichen neu gelesen. Da haben natürlich auch Nutzung/Nicht-Nutzung von Virtualisierung (s. VirtualizationStackPanel), Cache und nicht zuletzt die Herkunft und Größe der Bilder einen Einfluss.

    Als Antwort würde ich also sagen: Ja, das kann schon 'normal' sein.

    Gruß
    Jürgen

    • Als Antwort markiert Flo0806 Dienstag, 15. Januar 2013 12:23
    Montag, 14. Januar 2013 16:25
  • Hi,
    solche Verzögerungen sind möglich, wenn ständig neue Objekte den ggf. gering bemessenen RAM zur Reorganisation (GC.Collect) zwingen. Ich löse solche Aufgabe durch Auslagerung der Filter-Routinen in einen thread. Sobald ein Tastenanschlag eine neue Filterung initiiert, wird der thread gestartet. Wenn beim nächsten Tastenanschlag der Thread noch läuft, wird der neue Filterwert in einen Puffer geschrieben. Am Ende der Filterroutine wird bei vorhandenem neuen Filterwert die Schleife nochmal durchlaufen. Bei jedem Durchlauf der Schleife wird über INotifyPropertyChanged die Oberfläche aktualisiert.
     
    --
    Peter Fleischer
    • Als Antwort markiert Flo0806 Dienstag, 15. Januar 2013 12:23
    Montag, 14. Januar 2013 21:12

Alle Antworten

  • Hi,

    soweit ich weiß, wird beim Neu-Filtern bzw. Neu-Sortieren (also über CollectionView.Refresh) die Datenquelle einmal komplett geleert und dann komplett neu aufgebaut und nicht nur - wie man bei immer längeren Texten hoffen könnte - weiter eingeschränkt. In Deinem Fall werden also auch die 1400 (bzw. gefilterten) Bilder bei jedem getippten Zeichen neu gelesen. Da haben natürlich auch Nutzung/Nicht-Nutzung von Virtualisierung (s. VirtualizationStackPanel), Cache und nicht zuletzt die Herkunft und Größe der Bilder einen Einfluss.

    Als Antwort würde ich also sagen: Ja, das kann schon 'normal' sein.

    Gruß
    Jürgen

    • Als Antwort markiert Flo0806 Dienstag, 15. Januar 2013 12:23
    Montag, 14. Januar 2013 16:25
  • Hi,
    solche Verzögerungen sind möglich, wenn ständig neue Objekte den ggf. gering bemessenen RAM zur Reorganisation (GC.Collect) zwingen. Ich löse solche Aufgabe durch Auslagerung der Filter-Routinen in einen thread. Sobald ein Tastenanschlag eine neue Filterung initiiert, wird der thread gestartet. Wenn beim nächsten Tastenanschlag der Thread noch läuft, wird der neue Filterwert in einen Puffer geschrieben. Am Ende der Filterroutine wird bei vorhandenem neuen Filterwert die Schleife nochmal durchlaufen. Bei jedem Durchlauf der Schleife wird über INotifyPropertyChanged die Oberfläche aktualisiert.
     
    --
    Peter Fleischer
    • Als Antwort markiert Flo0806 Dienstag, 15. Januar 2013 12:23
    Montag, 14. Januar 2013 21:12