Optimalizace výkonu: Datová vazba

Windows Presentation Foundation (WPF) datová vazba poskytuje jednoduchý a konzistentní způsob, jak aplikace prezentovat a pracovat s daty. Prvky mohou být vázány na data z různých zdrojů dat ve formě objektů CLR a XML.

Toto téma obsahuje doporučení k výkonu datových vazeb.

Jak se přeloží odkazy na datové vazby

Než proberete problémy s výkonem datových vazeb, je vhodné prozkoumat, jak modul datových vazeb WPF (Windows Presentation Foundation) řeší odkazy na objekty pro vazbu.

Zdrojem datové vazby Windows Presentation Foundation (WPF) může být libovolný objekt CLR. Můžete vytvořit vazbu k vlastnostem, dílčím vlastnostem nebo indexerům objektu CLR. Odkazy na vazby jsou vyřešeny pomocí reflexe rozhraní Microsoft .NET Framework nebo ICustomTypeDescriptor. Tady jsou tři metody pro překlad odkazů na objekty pro vazbu.

První metoda zahrnuje použití reflexe. V tomto případě PropertyInfo se objekt používá ke zjišťování atributů vlastnosti a poskytuje přístup k metadatům vlastností. Při použití rozhraní používá modul datových ICustomTypeDescriptor vazeb toto rozhraní pro přístup k hodnotám vlastností. Rozhraní ICustomTypeDescriptor je zvlášť užitečné v případech, kdy objekt nemá statickou sadu vlastností.

Oznámení o změnách vlastností lze poskytnout buď implementací INotifyPropertyChanged rozhraní, nebo pomocí oznámení změn přidružených k sadě TypeDescriptor. Upřednostňovanou strategií pro implementaci oznámení o změnách vlastností je však použití INotifyPropertyChanged.

Pokud je zdrojový objekt objekt CLR a zdrojová vlastnost je vlastnost CLR, modul datové vazby Windows Presentation Foundation (WPF) musí nejprve použít reflexi zdrojového objektu k získání TypeDescriptora následné dotazování na PropertyDescriptor. Tato posloupnost operací reflexe je potenciálně velmi časově náročná z hlediska výkonu.

Druhá metoda pro překlad odkazů na objekt zahrnuje zdrojový objekt CLR, který implementuje INotifyPropertyChanged rozhraní, a zdrojovou vlastnost, která je vlastností CLR. V tomto případě modul datových vazeb používá odraz přímo na zdrojovém typu a získá požadovanou vlastnost. Stále to není optimální metoda, ale bude to stát méně v pracovních požadavcích nastavených než první metoda.

Třetí metoda pro překlad odkazů na objekt zahrnuje zdrojový objekt, který je a zdroj vlastnost, která je DependencyObjectDependencyProperty. V tomto případě modul datových vazeb nemusí používat reflexi. Místo toho modul vlastností a modul datové vazby společně přeloží odkaz na vlastnost nezávisle. Toto je optimální metoda pro překlad odkazů na objekty používaných pro datová vazba.

Následující tabulka porovnává rychlost vazby dat na Text vlastnost jednoho tisíce TextBlock prvků pomocí těchto tří metod.

Vytvoření vazby vlastnosti TextBlocku Doba vazby (ms) Doba vykreslování – zahrnuje vazbu (ms)
Vlastnost objektu CLR 115 314
Vlastnost objektu CLR, který implementuje INotifyPropertyChanged 115 305
DependencyProperty Na řadu DependencyObject. 90 263

Vazba na velké objekty CLR

Při vytváření vazby dat k jednomu objektu CLR s tisíci vlastností existuje významný dopad na výkon. Tento dopad můžete minimalizovat rozdělením jednoho objektu na více objektů CLR s menším počtem vlastností. Tabulka zobrazuje dobu vazby a vykreslování datových vazeb na jeden velký objekt CLR a více menších objektů.

Datová vazba 1000 Objekty TextBlock Doba vazby (ms) Doba vykreslování – zahrnuje vazbu (ms)
Objekt CLR s 1000 vlastnostmi 950 1200
Do 1000 objektů CLR s jednou vlastností 115 314

Vazba na zdroj položek

Představte si scénář, ve kterém máte objekt CLR List<T> , který obsahuje seznam zaměstnanců, které chcete zobrazit v objektu ListBox. Chcete-li vytvořit korespondenci mezi těmito dvěma objekty, vytvoříte vazbu seznamu zaměstnanců na ItemsSource vlastnost objektu ListBox. Předpokládejme ale, že máte nového zaměstnance, který se připojí ke skupině. Možná si myslíte, že pokud chcete vložit tuto novou osobu do vašich vázaných ListBox hodnot, jednoduše byste tuto osobu přidali do seznamu zaměstnanců a očekávali, že tato změna bude automaticky rozpoznána modulem datových vazeb. Tento předpoklad by prokázal nepravda; ve skutečnosti se změna automaticky neprojeví ListBox . Důvodem je to, že objekt CLR List<T> automaticky nevyvolá změněnou událost kolekce. Aby bylo možné změny vyzvednout ListBox , budete muset znovu vytvořit seznam zaměstnanců a znovu ho připojit k ItemsSource majetku objektu ListBox. I když toto řešení funguje, představuje obrovský dopad na výkon. Při každém opětovném přiřazení ItemsSourceListBox k novému objektu ListBox první vyhodí předchozí položky a znovu vygeneruje celý seznam. Dopad na výkon se zvětšuje, pokud se ListBox mapy mapují na komplexní DataTemplate.

Velmi efektivním řešením tohoto problému je vytvořit seznam ObservableCollection<T>zaměstnanců . Objekt ObservableCollection<T> vyvolá oznámení o změně, které může modul datových vazeb přijímat. Událost přidá nebo odebere položku z objektu ItemsControl bez nutnosti znovu vygenerovat celý seznam.

Následující tabulka ukazuje čas potřebný k aktualizaci ListBox (s vypnutou virtualizací uživatelského rozhraní) při přidání jedné položky. Číslo v prvním řádku představuje uplynulý čas, kdy je objekt CLR List<T> vázán na ListBox element .ItemsSource Číslo ve druhém řádku představuje uplynulý čas, kdy ObservableCollection<T> je vázán na ListBox prvek ItemsSource. Všimněte si významných časových úspor pomocí ObservableCollection<T> strategie datové vazby.

Datová vazba na ItemsSource Doba aktualizace pro 1 položku (ms)
Do objektu CLR List<T> 1656
Do ObservableCollection<T> 20

Vazba IList na ItemsControl není IEnumerable

Pokud máte volbu mezi vazbou objektu IList<T> nebo IEnumerable objektem ItemsControl , zvolte objekt IList<T> . Vazba IEnumerable na ItemsControl vynutí WPF vytvořit objekt obálky IList<T> , což znamená, že výkon je ovlivněn zbytečným režií druhého objektu.

Nepřeveďte objekty CLR na XML pouze pro datové vazby.

WPF umožňuje vytvořit vazbu na obsah XML; Datové vazby k obsahu XML jsou však pomalejší než datové vazby k objektům CLR. Nepřeveďte data objektů CLR na XML, pokud je jediným účelem datové vazby.

Viz také