Bagikan melalui


Mengoptimalkan Performa: Pengikatan Data

Pengikatan data Windows Presentation Foundation (WPF) menyediakan cara yang sederhana dan konsisten bagi aplikasi untuk menyajikan dan berinteraksi dengan data. Elemen dapat terikat ke data dari berbagai sumber data dalam bentuk objek CLR dan XML.

Topik ini menyediakan rekomendasi performa pengikatan data.

Cara Referensi Pengikatan Data Diselesaikan

Sebelum membahas masalah performa pengikatan data, ada baiknya untuk mengeksplorasi bagaimana mesin pengikatan data Windows Presentation Foundation (WPF) menyelesaikan referensi objek untuk pengikatan.

Sumber pengikatan data Windows Presentation Foundation (WPF) dapat berupa objek CLR apa pun. Anda dapat mengikat properti, sub-properti, atau pengindeks objek CLR. Referensi pengikatan diselesaikan dengan menggunakan refleksi Microsoft .NET Framework atau ICustomTypeDescriptor. Berikut adalah tiga metode untuk menyelesaikan referensi objek untuk pengikatan.

Metode pertama melibatkan penggunaan pantulan. Dalam hal ini, PropertyInfo objek digunakan untuk menemukan atribut properti dan menyediakan akses ke metadata properti. Saat menggunakan ICustomTypeDescriptor antarmuka, mesin pengikatan data menggunakan antarmuka ini untuk mengakses nilai properti. Antarmuka ICustomTypeDescriptor ini sangat berguna dalam kasus di mana objek tidak memiliki sekumpulan properti statis.

Pemberitahuan perubahan properti dapat disediakan baik dengan menerapkan INotifyPropertyChanged antarmuka atau dengan menggunakan pemberitahuan perubahan yang terkait dengan TypeDescriptor. Namun, strategi yang disukai untuk menerapkan pemberitahuan perubahan properti adalah menggunakan INotifyPropertyChanged.

Jika objek sumber adalah objek CLR dan properti sumber adalah properti CLR, mesin pengikatan data Windows Presentation Foundation (WPF) harus terlebih dahulu menggunakan pantulan pada objek sumber untuk mendapatkan TypeDescriptor, lalu mengkueri untuk PropertyDescriptor. Urutan operasi refleksi ini berpotensi sangat memakan waktu dari perspektif performa.

Metode kedua untuk menyelesaikan referensi objek melibatkan objek sumber CLR yang mengimplementasikan INotifyPropertyChanged antarmuka, dan properti sumber yang merupakan properti CLR. Dalam hal ini, mesin pengikatan data menggunakan pantulan langsung pada jenis sumber dan mendapatkan properti yang diperlukan. Ini masih bukan metode optimal, tetapi akan lebih murah dalam persyaratan set kerja daripada metode pertama.

Metode ketiga untuk menyelesaikan referensi objek melibatkan objek sumber yang merupakan DependencyObject dan properti sumber yang merupakan DependencyProperty. Dalam hal ini, mesin pengikatan data tidak perlu menggunakan pantulan. Sebagai gantinya, mesin properti dan mesin pengikatan data bersama-sama menyelesaikan referensi properti secara independen. Ini adalah metode optimal untuk menyelesaikan referensi objek yang digunakan untuk pengikatan data.

Tabel di bawah ini membandingkan kecepatan data yang mengikat Text properti seribu TextBlock elemen menggunakan ketiga metode ini.

Mengikat properti Teks dari TextBlock Waktu pengikatan (ms) Waktu render -- termasuk pengikatan (ms)
Ke properti objek CLR 115 314
Ke properti objek CLR yang mengimplementasikan INotifyPropertyChanged 115 305
Untuk dari DependencyPropertyDependencyObject. 90 263

Pengikatan ke Objek CLR Besar

Ada dampak performa yang signifikan saat Anda mengikat data ke satu objek CLR dengan ribuan properti. Anda dapat meminimalkan dampak ini dengan membagi objek tunggal menjadi beberapa objek CLR dengan lebih sedikit properti. Tabel memperlihatkan waktu pengikatan dan penyajian untuk pengikatan data ke satu objek CLR besar versus beberapa objek yang lebih kecil.

Pengikatan data 1000 objek TextBlock Waktu pengikatan (ms) Waktu render -- termasuk pengikatan (ms)
Ke objek CLR dengan 1000 properti 950 1200
Ke 1000 objek CLR dengan satu properti 115 314

Mengikat ke ItemsSource

Pertimbangkan skenario di mana Anda memiliki objek CLR List<T> yang menyimpan daftar karyawan yang ingin Anda tampilkan di ListBox. Untuk membuat korespondensi antara kedua objek ini, Anda akan mengikat daftar karyawan Anda ke ItemsSource properti .ListBox Namun, misalkan Anda memiliki karyawan baru yang bergabung dengan grup Anda. Anda mungkin berpikir bahwa untuk memasukkan orang baru ini ke dalam nilai terikat ListBox Anda, Anda cukup menambahkan orang ini ke daftar karyawan Anda dan mengharapkan perubahan ini dikenali oleh mesin pengikatan data secara otomatis. Asumsi itu akan terbukti palsu; dalam aktualitas, perubahan tidak akan tercermin secara ListBox otomatis. Ini karena objek CLR List<T> tidak secara otomatis menaikkan peristiwa yang diubah koleksi. Untuk mendapatkan ListBox untuk mengambil perubahan, Anda harus membuat ulang daftar karyawan Anda dan melampirkannya kembali ke ItemsSource properti .ListBox Meskipun solusi ini berfungsi, solusi ini memperkenalkan dampak performa yang besar. Setiap kali Anda menetapkan ItemsSourceListBox ulang ke objek baru, yang ListBox pertama membuang item sebelumnya dan meregenerasi seluruh daftarnya. Dampak performa diperbesar jika peta Anda ListBox ke kompleks DataTemplate.

Solusi yang sangat efisien untuk masalah ini adalah membuat daftar karyawan Anda menjadi ObservableCollection<T>. Objek ObservableCollection<T> menaikkan pemberitahuan perubahan yang dapat diterima mesin pengikatan data. Peristiwa menambahkan atau menghapus item dari ItemsControl tanpa perlu meregenerasi seluruh daftar.

Tabel di bawah ini menunjukkan waktu yang diperlukan untuk memperbarui ListBox (dengan virtualisasi UI dimatikan) saat satu item ditambahkan. Angka dalam baris pertama menunjukkan waktu yang berlalu ketika objek CLR List<T> terikat ke ListBox elemen ItemsSource. Angka di baris kedua menunjukkan waktu yang berlalu ketika terikat ObservableCollection<T> ke ListBox elemen ItemsSource. Perhatikan penghematan waktu yang signifikan menggunakan ObservableCollection<T> strategi pengikatan data.

Data yang mengikat ItemsSource Perbarui waktu untuk 1 item (ms)
Ke objek CLR List<T> 1656
Ke ObservableCollection<T> 20

IList Iikat ke ItemKontrol bukan IEnumerable

Jika Anda memiliki pilihan antara mengikat atau IList<T> ke IEnumerableItemsControl objek, pilih IList<T> objek . Pengikatan IEnumerable ke ItemsControl WPF paksa untuk membuat objek pembungkus IList<T> , yang berarti performa Anda terpengaruh oleh overhead objek kedua yang tidak perlu.

Jangan Konversi objek CLR ke XML Hanya untuk Pengikatan Data.

WPF memungkinkan Anda untuk mengikat data ke konten XML; namun, pengikatan data ke konten XML lebih lambat daripada pengikatan data ke objek CLR. Jangan mengonversi data objek CLR ke XML jika satu-satunya tujuan adalah untuk pengikatan data.

Baca juga