© best_vector/Shutterstock.com
Windows Developer
Kolumne: XAML Expertise

WPF und Windows-Apps

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF-Performancetipp: die SpeedObservableCollection“, „WPF-Performancetipp: ObservableCollection performanter threadübergreifend synchronisieren“ und „XAML: XAML Designer ohne Code laden“.

Gregor Biswanger


WPF-Performancetipp: die SpeedObservableCollectionGenau das erledigt in diesem Fall die schnell 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. Unter Listing 1 steht der Sourcecode zur SpeedObservableCollection.Ein Test mit einfachen 3 500 Datensätzen zeigt, dass die Standard-ObservableCollection mit ihrem Verhalten zirka eine halbe Sekunde benötigt, um die Daten bei einem DataGrid zu füllen. Mit der SpeedObserv­ableCollection sind die Daten bereits ab zirka zwei Millisekunden auf dem UI. Dieses Beispiel wird unter Abbildung 1 verdeutlicht.Listing 1: Sourcecode zur „SpeedObservableCollection“using System.Collections.Generic;using System.Collections.ObjectModel;using System.Collections.Specialized; public class SpeedObservableCollection : ObservableCollection{ public SpeedObservableCollection() { _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); } }}using System.Collections.Generic;using System.Collections.ObjectModel;using System.Collections.Specialized; public class SpeedObservableCollection : ObservableCollection{ public SpeedObservableCollection() { _suspendCollectionChangeNotification = false; }  bool _suspendCollectionChangeNotification;  protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { if (!_suspendCollectionChangeNotification) { base.OnCollectionChanged(e); } }  public void SuspendCollectionChangeNotification() { _suspe...

Windows Developer
Kolumne: XAML Expertise

WPF und Windows-Apps

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF-Performancetipp: die SpeedObservableCollection“, „WPF-Performancetipp: ObservableCollection performanter threadübergreifend synchronisieren“ und „XAML: XAML Designer ohne Code laden“.

Gregor Biswanger


WPF-Performancetipp: die SpeedObservableCollectionGenau das erledigt in diesem Fall die schnell 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. Unter Listing 1 steht der Sourcecode zur SpeedObservableCollection.Ein Test mit einfachen 3 500 Datensätzen zeigt, dass die Standard-ObservableCollection mit ihrem Verhalten zirka eine halbe Sekunde benötigt, um die Daten bei einem DataGrid zu füllen. Mit der SpeedObserv­ableCollection sind die Daten bereits ab zirka zwei Millisekunden auf dem UI. Dieses Beispiel wird unter Abbildung 1 verdeutlicht.Listing 1: Sourcecode zur „SpeedObservableCollection“using System.Collections.Generic;using System.Collections.ObjectModel;using System.Collections.Specialized; public class SpeedObservableCollection : ObservableCollection{ public SpeedObservableCollection() { _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); } }}using System.Collections.Generic;using System.Collections.ObjectModel;using System.Collections.Specialized; public class SpeedObservableCollection : ObservableCollection{ public SpeedObservableCollection() { _suspendCollectionChangeNotification = false; }  bool _suspendCollectionChangeNotification;  protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { if (!_suspendCollectionChangeNotification) { base.OnCollectionChanged(e); } }  public void SuspendCollectionChangeNotification() { _suspe...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang