Share via


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.