UI-Elemente der Mausposition finden Speed ObservableCollection WP7-App als Trial anbieten (Teil 2)
Kommentare

Menü 2 für Experten: Speed ObservableCollection
Unter WPF und Silverlight ist die ObservableCollection enorm wichtig. Nur so kann automatisch beim Hinzufügen von mehreren Daten die Oberfläche informiert

Menü 2 für Experten: Speed ObservableCollection

Unter WPF und Silverlight ist die ObservableCollection enorm wichtig. Nur so kann automatisch beim Hinzufügen von mehreren Daten die Oberfläche informiert werden. Jedoch bringt sie bei vielen Datensätzen ein großes Problem mit sich, denn sie informiert die UI mit jedem neuen Item, was bedeutet, dass z. B. bei 1.000 Datensätzen auch tausendmal hintereinander die UI informiert wird. Besser wäre es, wenn zunächst alle Daten in die ObservableCollection gefüllt würden und erst dann die Information an die UI rausginge. Genau das erledigt die selbst geschriebene Speed ObservableCollection. Diese leitet von der ObservableCollection ab und überschreibt die OnCollectionChanged-Methode. Zusätzlich wird eine weitere Methode mit AddRange hinzugefügt. Dieser kann man ganze Listen übergeben, die erst nach dem vollständigen Hinzufügen der Daten ein CollectionChanged zulässt (Listing 2).

Ein Test mit 3.500 einfachen Datensätzen zeigt, dass die Standard-ObservableCollection mit ihrem Verhalten circa eine halbe Sekunde braucht, um die Daten bei einem DataGrid zu füllen. Mit der SpeedCollection sind die Daten bereits ab circa 2 Millisekunden auf der UI (Abb. 1).

Listing 2: Sourcecode zur SpeedCollection

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

public class SpeedCollection : ObservableCollection
{
    public SpeedCollection()
    {
        _suspendCollectionChangeNotification = false;
    }

    bool _suspendCollectionChangeNotification;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!_suspendCollectionChangeNotification)
        {
            base.OnCollectionChanged(e);
        }
    }

    public void SuspendCollectionChangeNotification()
    {
        _suspendCollectionChangeNotification = true;
    }

    public void ResumeCollectionChangeNotification()
    {
        _suspendCollectionChangeNotification = false;
    }

    public void AddRange(IEnumerable items)
    {
        SuspendCollectionChangeNotification();

        try
        {
            foreach (var i in items)
                base.InsertItem(Count, i);
        }
        finally
        {
            ResumeCollectionChangeNotification();
            var arg = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
            OnCollectionChanged(arg);
        }
    }
}  
Abb.1: ObservableCollection vs. Speed ObservableCollection
Abb.1: ObservableCollection vs. Speed ObservableCollection
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -