Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows Presentation Foundation (WPF) adatkötése egyszerű és konzisztens módot biztosít az alkalmazások számára az adatok bemutatására és kezelésére. Az elemek különböző adatforrásokból származó adatokhoz köthetők CLR objektumok és XML-fájlok formájában.
Ez a témakör adatkötési teljesítménnyel kapcsolatos javaslatokat tartalmaz.
Adatkötési hivatkozások feloldása
Az adatkötési teljesítmény problémáinak megvitatása előtt érdemes megvizsgálni, hogy a Windows Presentation Foundation (WPF) adatkötési motor hogyan oldja meg a kötés objektumhivatkozásait.
A Windows Presentation Foundation (WPF) adatkötésének forrása bármely CLR objektum lehet. Egy CLR objektum tulajdonságaihoz, altulajdonságaihoz vagy indexelőihez is kapcsolódhat. A kötési hivatkozások feloldása a Microsoft .NET-keretrendszer tükrözésével vagy egy ICustomTypeDescriptorhasználatával történik. Az alábbi három módszer a kötés objektumhivatkozásainak feloldására használható.
Az első módszer a tükröződés használatát foglalja magában. Ebben az esetben a PropertyInfo objektum a tulajdonság attribútumainak felderítésére szolgál, és hozzáférést biztosít a tulajdonság metaadataihoz. A ICustomTypeDescriptor interfész használatakor az adatkötési motor ezt az interfészt használja a tulajdonságértékek eléréséhez. A ICustomTypeDescriptor felület különösen akkor hasznos, ha az objektum nem rendelkezik statikus tulajdonságokkal.
A tulajdonságmódosítási értesítéseket a INotifyPropertyChanged felület implementálásával vagy a TypeDescriptortársított változásértesítések használatával lehet biztosítani. A tulajdonságváltozás-értesítések implementálásának elsődleges stratégiája azonban a INotifyPropertyChangedhasználata.
Ha a forrásobjektum egy CLR objektum, és a forrástulajdonság egy CLR tulajdonság, a Windows Presentation Foundation (WPF) adatkötési motornak először tükröződést kell használnia a forrásobjektumon a TypeDescriptorlekéréséhez, majd le kell kérdeznie egy PropertyDescriptor. A tükrözési műveletek sorozata teljesítmény szempontjából nagyon időigényes lehet.
Az objektumhivatkozások feloldásának második módszere egy CLR forrásobjektum, amely implementálja a INotifyPropertyChanged felületet, valamint egy CLR tulajdonságú forrástulajdonság. Ebben az esetben az adatkötési motor közvetlenül a forrástípus tükrözését használja, és megkapja a szükséges tulajdonságot. Ez még mindig nem az optimális módszer, de kevesebbe fog kerülni a munkakészletre vonatkozó követelményeknél, mint az első módszer.
Az objektumhivatkozások feloldásának harmadik módszere magában foglal egy DependencyObject jelű forrásobjektumot és egy DependencyPropertyjelű forrástulajdonságot. Ebben az esetben az adatkötési motornak nem kell tükröződést használnia. Ehelyett a tulajdonságmotor és az adatkötési motor egymástól függetlenül oldja fel a tulajdonsághivatkozást. Ez az optimális módszer az adatkötéshez használt objektumhivatkozások feloldásához.
Az alábbi táblázat a három módszer használatával összehasonlítja az ezer Text elem TextBlock tulajdonságának adatkötési sebességét.
| A TextBlock Szöveg tulajdonságának kötése | kötési idő (ms) | Renderelési idő – beleértve a kötést (ms) |
|---|---|---|
| Egy CLR objektum tulajdonságára | 115 | 314 |
| Egy CLR objektum tulajdonságára, amely megvalósítja INotifyPropertyChanged | 115 | 305 |
| Egy DependencyPropertyDependencyObject. | 90 | 263 |
Kötés nagyméretű CLR objektumokhoz
Jelentős teljesítményhatással jár, ha több ezer tulajdonsággal rendelkező CLR objektumhoz köti az adatokat. Ezt a hatást minimalizálhatja úgy, hogy az egyetlen objektumot több CLR objektumra osztja kevesebb tulajdonsággal. A táblázat egy nagy CLR objektumhoz és több kisebb objektumhoz való adatkötés kötési és megjelenítési idejét jeleníti meg.
| 1000 TextBlock-objektum adatkötése | kötési idő (ms) | Renderelési idő – beleértve a kötést (ms) |
|---|---|---|
| 1000 tulajdonsággal rendelkező CLR objektumra | 950 | Ezerkétszáz |
| 1000 CLR objektumhoz egyetlen tulajdonsággal | 115 | 314 |
Kötés az ItemsSource-hoz
Fontolja meg azt a forgatókönyvet, amelyben egy CLRList<T> objektummal rendelkezik, amely tartalmazza a megjeleníteni kívánt alkalmazottak listáját a ListBox-ben. A két objektum közötti megfeleltetés létrehozásához az alkalmazotti listát a ItemsSourceListBox tulajdonságához kell kötnie. Tegyük fel azonban, hogy új alkalmazott csatlakozik a csoporthoz. Azt gondolhatja, hogy ha be szeretné szúrni ezt az új személyt a kötött ListBox értékeibe, egyszerűen hozzáadná ezt a személyt az alkalmazotti listához, és elvárná, hogy ezt a változást az adatkötési motor automatikusan felismerje. Ez a feltételezés hamisnak bizonyul; valójában a változás nem fog automatikusan megjelenni a ListBox-ban. Ennek az az oka, hogy a CLRList<T> objektum nem hoz létre automatikusan egy gyűjteményben módosított eseményt. Ahhoz, hogy a ListBox átvehesse a módosításokat, újra létre kell hoznia az alkalmazottak listáját, és újra kell csatolnia a ItemsSourceListBox tulajdonságához. Bár ez a megoldás működik, hatalmas teljesítményhatást vezet be. Minden alkalommal, amikor új objektumhoz rendeli a ItemsSource-át a ListBox-ből, az ListBox először eldobja a korábbi elemeket, és újra létrehozza a teljes listát. A teljesítményre gyakorolt hatás akkor van nagyítva, ha a ListBox összetett DataTemplateképez le.
Erre a problémára nagyon hatékony megoldás, ha az alkalmazotti listát ObservableCollection<T>típusúvá alakítjuk. Egy ObservableCollection<T> objektum változásértesítést küld, amelyet az adatkötési motor fogadhat. Az esemény hozzáad vagy eltávolít egy elemet egy ItemsControl anélkül, hogy újra kellene létrehoznia a teljes listát.
Az alábbi táblázat azt mutatja be, hogy mennyi ideig tart frissíteni a ListBox (a felhasználói felület virtualizálása ki van kapcsolva) egy elem hozzáadásakor. Az első sorban szereplő szám azt az eltelt időt jelöli, amikor a CLRList<T> objektum ListBox elem ItemsSourcevan kötve. A második sorban szereplő szám azt az eltelt időt jelöli, amikor egy ObservableCollection<T> kötődik a ListBox elem ItemsSource-hez. Figyelje meg a ObservableCollection<T> adatkötési stratégiával járó jelentős időmegtakarítást.
| az adatkötés az ItemsSource számára | Frissítési ideje 1 elemnek (ms) |
|---|---|
| CLR List<T> objektumra. | 1656 |
| Egy ObservableCollection<T>-hoz | 20 |
Kösse az IList-et az ItemsControlhoz, ne az IEnumerablét.
Ha választhat egy IList<T> vagy egy IEnumerableItemsControl objektumhoz való kötése között, válassza ki a IList<T> objektumot. A IEnumerableItemsControl kötése kényszeríti a WPF-et egy burkoló IList<T> objektum létrehozására, ami azt jelenti, hogy a teljesítményt egy második objektum felesleges többletterhelése befolyásolja.
Ne konvertálja CLR objektumokat XML-fájllá csak adatkötéshez.
A WPF lehetővé teszi az XML-tartalomhoz való adatkötést; az XML-tartalomhoz való adatkötés azonban lassabb, mint CLR objektumokhoz való adatkötés. Ne konvertálja CLR objektumadatokat XML-fájllá, ha az egyetlen cél az adatkötés.
Lásd még
- WPF-alkalmazások teljesítményének optimalizálása
- Alkalmazásteljesítmény- tervezése
- A hardver előnyeinek kihasználása
- Elrendezés és tervezés
- 2D grafikus és képalkotó
- objektum viselkedése
- alkalmazáserőforrások
- Szöveg
- Egyéb teljesítményjavaslatok
- adatkötés áttekintése
- Útmutató: Alkalmazásadatok gyorsítótárazása WPF-alkalmazásban
.NET Desktop feedback