Performansı İyileştirme: Veri Bağlama
Windows Presentation Foundation (WPF) veri bağlama, uygulamaların verileri sunarak verilerle etkileşim kurması için basit ve tutarlı bir yol sağlar. Öğeler, CLR nesneleri ve XML biçiminde çeşitli veri kaynaklarından verilere bağlı olabilir.
Bu konu, veri bağlama performansı önerileri sağlar.
Veri Bağlama Başvuruları Nasıl Çözümlenir?
Veri bağlama performansı sorunlarını incelemeden önce, Windows Presentation Foundation (WPF) veri bağlama altyapısının bağlama için nesne başvurularını nasıl çözümleyebli olduğunu keşfetmekte değerlisiniz.
Bir Windows Presentation Foundation (WPF) veri bağlamanın kaynağı herhangi bir CLR nesnesi olabilir. ClR nesnesinin özelliklerine, alt özelliklerine veya dizinleyicilere bağlanabilirsiniz. Bağlama başvuruları, Microsoft .NET Framework veya bir kullanılarak ICustomTypeDescriptor çözümlenir. Bağlama için nesne başvurularını çözümlemek için üç yöntem burada vetir.
İlk yöntem yansıma kullanmayı içerir. Bu durumda, PropertyInfo özelliğin özniteliklerini bulmak için nesnesi kullanılır ve özellik meta verilerine erişim sağlar. Veri bağlama ICustomTypeDescriptor altyapısı, arabirimini kullanırken özellik değerlerine erişmek için bu arabirimi kullanır. Arabirimi ICustomTypeDescriptor özellikle nesnenin statik bir özellik kümesine sahip olmayan durumlarda yararlıdır.
Özellik değişikliği bildirimleri, arabirimi uygulanarak veya ile INotifyPropertyChanged ilişkili değişiklik bildirimleri kullanılarak sağlanmalıdır. TypeDescriptor Ancak, özellik değişikliği bildirimlerini uygulamak için tercih edilen strateji INotifyPropertyChanged kullanmaktır.
Kaynak nesne bir CLR nesnesi ise ve kaynak özellik bir CLR özelliği ise, Windows Presentation Foundation (WPF) veri bağlama altyapısının önce , almak için kaynak nesnede yansımayı kullanması ve ardından sorgusunu TypeDescriptor sorgulaması PropertyDescriptor gerekir. Bu yansıma işlemleri dizisi performans açısından çok zaman alabilir.
Nesne başvurularını çözümlemeye yönelik ikinci yöntem, arabirimi uygulayan bir CLR kaynak nesnesini ve CLR özelliği INotifyPropertyChanged olan bir kaynak özelliği içerir. Bu durumda, veri bağlama altyapısı doğrudan kaynak türü üzerinde yansıma kullanır ve gerekli özelliği alır. Bu yine de en uygun yöntem değildir, ancak çalışma kümesi gereksinimlerinin maliyeti ilk yönteme göre daha düşük olur.
Nesne başvurularını çözümlemek için üçüncü yöntem, ve olan bir kaynak DependencyObject özelliği olan bir kaynak nesnesi DependencyProperty içerir. Bu durumda, veri bağlama altyapısının yansımayı kullanması gerek yoktur. Bunun yerine, özellik altyapısı ve veri bağlama altyapısı birlikte özellik başvurularını bağımsız olarak çözümler. Bu, veri bağlama için kullanılan nesne başvurularını çözümlemek için en uygun yöntemdir.
Aşağıdaki tabloda, bu üç yöntemi kullanarak bir bin Text öğenin özelliğinin veri TextBlock bağlama hızı karşılaştırıldı.
| TextBlock'ların Text özelliğini bağlama | Bağlama süresi (ms) | İşleme süresi -- bağlamayı içerir (ms) |
|---|---|---|
| CLR nesnesinin özelliğine | 115 | 314 |
| Uygulayan bir CLR nesnesinin özelliğine INotifyPropertyChanged | 115 | 305 |
| bir DependencyPropertyDependencyObject için. | 90 | 263 |
Büyük CLR Nesnelerine Bağlama
Binlerce özelliği olan tek bir CLR nesnesine veri bağlamanın önemli bir performans etkisi vardır. Bu etkiyi en aza indirmek için tek nesneyi daha az özellik içeren birden çok CLR nesnesine bölebilirsiniz. Tablo, tek bir büyük CLR nesnesine ve birden çok küçük nesneye veri bağlama için bağlama ve işleme sürelerini gösterir.
| Veri bağlama 1000 TextBlock nesneleri | Bağlama süresi (ms) | İşleme süresi -- bağlamayı içerir (ms) |
|---|---|---|
| 1000 özelliği olan bir CLR nesnesine | 950 | 1200 |
| Tek özelliği olan 1000 CLR nesnesine | 115 | 314 |
ItemsSource'a Bağlama
içinde görüntülemek istediğiniz çalışanların listesini tutan bir CLR nesnenizi List<T> olan bir senaryoyu ListBox düşünün. Bu iki nesne arasında iletişim oluşturmak için çalışan listenizi ItemsSource özelliğinin özelliğine bağlardınız. ListBox Ancak, grubunuzla yeni bir çalışanın katıldığını varsayalım. Bu yeni kişiyi bağlı değerlerinize eklemek için bu kişiyi çalışan listenize eklemeniz ve bu değişikliğin veri bağlama altyapısı tarafından otomatik olarak tanınması ListBox beklenir. Bu varsayım yanlıştır; aslında, değişiklik otomatik olarak içinde ListBox yansıtılır. Bunun nedeni CLR List<T> nesnesinin koleksiyonda değiştirilen bir olayı otomatik olarak oluşturmaz. Değişiklikleri almak için, çalışan listenizi yeniden oluşturmanız ve bunu özelliğinin özelliğine ListBox yeniden ItemsSource bağlamanız ListBox gerekir. Bu çözüm çalışırken büyük bir performans etkisine neden olur. nesnesini yeni bir nesneye her yeniden atarken, ilki önceki öğelerini atar ve ItemsSourceListBoxListBox listesinin tamamını yeniden oluşturur. Karmaşık bir ile eşlerken performans ListBox etkisi büyütülmüş DataTemplate olur.
Bu soruna çok verimli bir çözüm, çalışan listenizi bir ObservableCollection<T> yapmaktır. Bir ObservableCollection<T> nesne, veri bağlama altyapısının alydırarak bir değişiklik bildirimi oluşturur. Olay, listenin tamamını yeniden oluşturmadan bir öğeyi ekler ItemsControl veya öğesinden kaldırır.
Aşağıdaki tabloda, bir öğe ekleniyorsa güncelleştirmek için gereken süre (UI sanallaştırma kapalı ListBox olarak) gösterilmiştir. İlk satırdaki sayı, CLR nesnesinin öğesinin öğesine bağlı List<T> olduğu geçen zamanı temsil ListBoxItemsSource eder. İkinci satırdaki sayı, öğesinin öğesine bağlı ObservableCollection<T> olduğunda geçen ListBox zamanı temsil ItemsSource eder. Veri bağlama stratejisini kullanarak önemli zaman ObservableCollection<T> tasarruflarını not edin.
| ItemsSource'a veri bağlama | 1 öğe için güncelleştirme zamanı (ms) |
|---|---|
| CLR List<T> nesnesine | 1656 |
| Bir ObservableCollection<T> | 20 |
IList'i IEnumerable değil ItemsControl'a Bağlama
Bir veya nesnesini bir IList<T> nesnesine bağlama arasında IEnumerable seçim ItemsControl yaptıysanız nesneyi IList<T> seçin. Bağlama, WPF'nin sarmalayıcı nesnesi oluşturması anlamına gelir ve bu da performansınızı ikinci bir nesnenin gereksiz ek yükü IEnumerableItemsControl tarafından IList<T> etkilendir.
ClR nesnelerini Yalnızca Veri Bağlama için XML'ye Dönüştürebilirsiniz.
WPF, XML içeriğine veri bağlamaya olanak sağlar; ancak, XML içeriğine veri bağlama, CLR nesnelerine veri bağlamadan daha yavaştır. Tek amaç veri bağlama içinse CLR nesne verilerini XML'ye dönüştürmeyin.
Ayrıca bkz.
- WPF Uygulama Performansını İyileştirme
- Uygulama Performansını Planlama
- Donanımdan Yararlanma
- Düzen ve Tasarım
- 2B Grafikleri ve Görüntüleme
- Nesne Davranışı
- Uygulama Kaynakları
- Metin
- Diğer Performans Önerileri
- Veri Bağlamaya Genel Bakış
- İzlenecek yol: WPF Uygulamasında Uygulama Verilerini Önbelleğe Alma