Performansı İyileştirme: Veri Bağlama
Windows Presentation Foundation (WPF) veri bağlaması, uygulamaların veri sunması ve verilerle etkileşim kurması için basit ve tutarlı bir yol sağlar. Öğeler, CLR nesneleri ve XML biçimindeki çeşitli veri kaynaklarından verilere bağlanabilir.
Bu konu, veri bağlama performansı önerileri sağlar.
Veri Bağlama Başvuruları Nasıl Çözümlenir?
Veri bağlama performansı sorunlarını ele almadan önce, Windows Presentation Foundation (WPF) veri bağlama altyapısının bağlama için nesne başvurularını nasıl çözümlediğinden bahsedebilirsiniz.
Windows Presentation Foundation (WPF) veri bağlamasının kaynağı herhangi bir CLR nesnesi olabilir. CLR nesnesinin özelliklerine, alt özelliklerine veya dizin oluşturucularına bağlanabilirsiniz. Bağlama başvuruları, Microsoft .NET Framework yansıması veya kullanılarak ICustomTypeDescriptorçözülür. Bağlama için nesne başvurularını çözümlemeye yönelik üç yöntem aşağıdadır.
İlk yöntem yansımayı kullanmayı içerir. Bu durumda, özelliğin PropertyInfo özniteliklerini bulmak için nesnesi kullanılır ve özellik meta verilerine erişim sağlar. Arabirimini kullanırken ICustomTypeDescriptor , veri bağlama altyapısı özellik değerlerine erişmek için bu arabirimi kullanır. Arabirim ICustomTypeDescriptor özellikle nesnenin statik bir özellik kümesine sahip olmadığı durumlarda kullanışlıdır.
Özellik değişikliği bildirimleri, arabirimi uygulanarak INotifyPropertyChanged veya ile TypeDescriptorilişkilendirilmiş değişiklik bildirimleri kullanılarak sağlanabilir. Ancak, özellik değişikliği bildirimlerini uygulamak için tercih edilen strateji kullanmaktır INotifyPropertyChanged.
Kaynak nesne bir CLR nesnesiyse ve kaynak özellik bir CLR özelliğiyse, Windows Presentation Foundation (WPF) veri bağlama altyapısının önce kaynak nesnedeki yansımayı kullanarak öğesini alması ve ardından sorguyu PropertyDescriptorkullanması TypeDescriptorgerekir. Bu yansıma işlemleri dizisi, performans açısından çok zaman alabilir.
Nesne başvurularını çözümlemek için ikinci yöntem, arabirimi uygulayan INotifyPropertyChanged bir CLR kaynak nesnesi ve CLR özelliği 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 hala en uygun yöntem değildir, ancak çalışma kümesi gereksinimlerinde ilk yöntemden daha düşük maliyetlidir.
Nesne başvurularını çözümlemek için üçüncü yöntem, ve olan bir kaynak özelliği olan DependencyObject bir kaynak nesnesi içerir DependencyProperty. Bu durumda, veri bağlama altyapısının yansıma kullanması gerekmez. Bunun yerine, özellik altyapısı ve veri bağlama altyapısı birlikte özellik başvuruyu 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 tablo, bu üç yöntemi kullanarak bin TextBlock öğe özelliğini bağlayan Text veri hızını karşılaştırır.
TextBlock'un Text özelliğini bağlama | Bağlama süresi (ms) | İşleme süresi -- bağlamayı (ms) içerir |
---|---|---|
CLR nesnesinin özelliğine | 115 | 314 |
Uygulayan bir CLR nesnesinin özelliğine INotifyPropertyChanged | 115 | 305 |
bir DependencyProperty öğesine DependencyObject. | 90 | 263 |
Büyük CLR Nesnelerine Bağlama
Binlerce özelliğe sahip tek bir CLR nesnesine veri bağladığınızda önemli bir performans etkisi olur. Tek nesneyi daha az özelliğe sahip birden çok CLR nesnesine bölerek bu etkiyi en aza indirebilirsiniz. Tabloda, tek bir büyük CLR nesnesine ve birden çok küçük nesneye veri bağlama için bağlama ve işleme süreleri gösterilir.
Veri bağlama 1000 TextBlock nesneleri | Bağlama süresi (ms) | İşleme süresi -- bağlamayı (ms) içerir |
---|---|---|
1000 özelliği olan bir CLR nesnesine | 950 | 1200 |
Bir ö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 List<T> nesnesine sahip olduğunuz bir ListBoxsenaryo düşünün. Bu iki nesne arasında bir yazışma oluşturmak için, çalışan listenizi öğesinin ItemsSourceListBoxözelliğine bağlarsınız. Ancak, grubunuzla birlikte yeni bir çalışanınız olduğunu varsayalım. Bu yeni kişiyi bağlı ListBox 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ını beklemeniz yeterli olabilir. Bu varsayım yanlış olduğunu kanıtlar; değişiklik otomatik olarak yansıtılmaz ListBox . Bunun nedeni CLR List<T> nesnesinin otomatik olarak koleksiyon değişikliği olayı oluşturmamasıdır. 'nin değişiklikleri almasını sağlamak ListBox için, çalışan listenizi yeniden oluşturmanız ve özelliğine ItemsSourceListBoxyeniden eklemeniz gerekir. Bu çözüm işe yarasa da, büyük bir performans etkisine neden olur. öğesini yeni bir nesneye her atadığınızda ItemsSourceListBox , ListBox ilki önceki öğelerini atar ve tüm listesini yeniden oluşturur. Karmaşık DataTemplatebir ile eşleniyorsa ListBox performans etkisi büyütülmüş olur.
Bu sorunun çok verimli bir çözümü, çalışan listenizi bir ObservableCollection<T>haline getirmektir. Nesne ObservableCollection<T> , veri bağlama altyapısının alabileceği bir değişiklik bildirimi oluşturur. Olay, listenin tamamını yeniden oluşturmak zorunda kalmadan bir ItemsControl öğe ekler veya öğesinden kaldırır.
Aşağıdaki tabloda, bir öğe eklendiğinde (UI sanallaştırma kapalıyken) güncelleştirilmesi ListBox için geçen süre gösterilmektedir. İlk satırdaki sayı, CLR List<T> nesnesinin öğesinin ItemsSourceöğesine bağlı ListBox olduğu geçen süreyi temsil eder. İkinci satırdaki sayı, öğesinin ObservableCollection<T> öğesine bağlı ListBoxItemsSourceolduğunda geçen süreyi temsil eder. Veri bağlama stratejisini kullanarak önemli ölçüde zaman tasarrufu elde edin ObservableCollection<T> .
ItemsSource'a veri bağlama | 1 öğe için güncelleştirme süresi (ms) |
---|---|
CLR List<T> nesnesine | 1656 |
Bir ObservableCollection<T> | 20 |
IList'i ItemsControl'e Bağlama IEnumerable değil
Bir veya IEnumerable bir öğesini bir nesneye ItemsControl bağlama IList<T> arasında bir seçeneğiniz varsa, nesneyi seçinIList<T>. Bağlama IEnumerable , ItemsControl WPF'yi bir sarmalayıcı IList<T> nesnesi oluşturmaya zorlar, bu da performansınızın ikinci bir nesnenin gereksiz yükünden etkilendiği anlamına gelir.
CLR nesnelerini Yalnızca Veri Bağlama için XML'ye dönüştürmeyin.
WPF, XML içeriğine veri bağlamanızı sağlar; ancak XML içeriğine veri bağlama, CLR nesnelerine veri bağlamadan daha yavaştır. Tek amaç veri bağlama amaçlıysa 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
.NET Desktop feedback