Gambaran umum properti dependensi

Topik ini menjelaskan sistem properti dependensi yang tersedia saat Anda menulis aplikasi Windows Runtime menggunakan C++, C#, atau Visual Basic bersama dengan definisi XAML untuk UI.

Apa itu properti dependensi?

Properti dependensi adalah jenis properti khusus. Secara khusus ini adalah properti tempat nilai properti dilacak dan dipengaruhi oleh sistem properti khusus yang merupakan bagian dari Windows Runtime.

Untuk mendukung properti dependensi, objek yang menentukan properti harus berupa DependencyObject (dengan kata lain kelas yang memiliki kelas dasar DependencyObject di suatu tempat dalam pewarisannya). Banyak jenis yang Anda gunakan untuk definisi UI Untuk aplikasi UWP dengan XAML akan menjadi subkelas DependencyObject , dan akan mendukung properti dependensi. Namun, jenis apa pun yang berasal dari namespace Windows Runtime yang tidak memiliki "XAML" dalam namanya tidak akan mendukung properti dependensi; properti dari jenis tersebut adalah properti biasa yang tidak akan memiliki perilaku dependensi sistem properti.

Tujuan properti dependensi adalah untuk menyediakan cara sistemik untuk menghitung nilai properti berdasarkan input lain (properti, peristiwa, dan status lain yang terjadi dalam aplikasi Anda saat berjalan). Input lain ini mungkin mencakup:

  • Input eksternal seperti preferensi pengguna
  • Mekanisme penentuan properti just-in-time seperti pengikatan data, animasi, dan papan cerita
  • Pola templat multi-penggunaan seperti sumber daya dan gaya
  • Nilai yang diketahui melalui hubungan induk-anak dengan elemen lain di pohon objek

Properti dependensi mewakili atau mendukung fitur tertentu dari model pemrograman untuk menentukan aplikasi Windows Runtime dengan XAML untuk UI dan C#, ekstensi komponen Microsoft Visual Basic atau Visual C++ (C++/CX) untuk kode. Fitur ini mencakup:

  • Pengikatan data
  • Gaya
  • Animasi papan cerita
  • Perilaku "PropertyChanged"; properti dependensi dapat diimplementasikan untuk menyediakan panggilan balik yang dapat menyebarluaskan perubahan ke properti dependensi lainnya
  • Menggunakan nilai default yang berasal dari metadata properti
  • Utilitas sistem properti umum seperti ClearValue dan pencarian metadata

Properti dependensi dan properti Windows Runtime

Properti dependensi memperluas fungsionalitas properti Windows Runtime dasar dengan menyediakan penyimpanan properti internal global yang mendukung semua properti dependensi dalam aplikasi pada durasi. Ini adalah alternatif untuk pola standar mendukung properti dengan bidang privat yang bersifat privat di kelas definisi properti. Anda dapat menganggap penyimpanan properti internal ini sebagai sekumpulan pengidentifikasi properti dan nilai yang ada untuk objek tertentu (selama itu adalah DependencyObject). Daripada diidentifikasi berdasarkan nama, setiap properti di penyimpanan diidentifikasi oleh instans DependencyProperty . Namun, sistem properti sebagian besar menyembunyikan detail implementasi ini: Anda biasanya dapat mengakses properti dependensi dengan menggunakan nama sederhana (nama properti terprogram dalam bahasa kode yang Anda gunakan, atau nama atribut saat Anda menulis XAML).

Jenis dasar yang menyediakan dasar sistem properti dependensi adalah DependencyObject. DependencyObject mendefinisikan metode yang dapat mengakses properti dependensi, dan instans kelas turunan DependencyObject secara internal mendukung konsep penyimpanan properti yang kami sebutkan sebelumnya.

Berikut adalah penjumlahan terminologi yang kita gunakan dalam dokumentasi saat membahas properti dependensi:

Istilah Deskripsi
Properti dependensi Properti yang ada pada pengidentifikasi DependencyProperty (lihat di bawah). Biasanya pengidentifikasi ini tersedia sebagai anggota statis dari kelas turunan DependencyObject yang mendefinisikan.
Pengidentifikasi properti dependensi Nilai konstanta untuk mengidentifikasi properti, biasanya bersifat publik dan baca-saja.
Pembungkus properti Implementasi get and set yang dapat dipanggil untuk properti Windows Runtime. Atau, proyeksi khusus bahasa dari definisi asli. Implementasi get property wrapper memanggil GetValue, meneruskan pengidentifikasi properti dependensi yang relevan.

Pembungkus properti tidak hanya kenyamanan bagi pemanggil, ini juga mengekspos properti dependensi ke proses, alat, atau proyeksi apa pun yang menggunakan definisi Windows Runtime untuk properti.

Contoh berikut mendefinisikan properti dependensi kustom seperti yang didefinisikan untuk C#, dan memperlihatkan hubungan pengidentifikasi properti dependensi dengan pembungkus properti.

public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
  "Label",
  typeof(string),
  typeof(ImageWithLabelControl),
  new PropertyMetadata(null)
);


public string Label
{
    get { return (string)GetValue(LabelProperty); }
    set { SetValue(LabelProperty, value); }
}

Catatan

Contoh sebelumnya tidak dimaksudkan sebagai contoh lengkap tentang cara membuat properti dependensi kustom. Ini dimaksudkan untuk menunjukkan konsep properti dependensi bagi siapa saja yang lebih suka mempelajari konsep melalui kode. Untuk penjelasan yang lebih lengkap tentang contoh ini, lihat Properti dependensi kustom.

Nilai properti dependensi didahulukan

Ketika Anda mendapatkan nilai properti dependensi, Anda mendapatkan nilai yang ditentukan untuk properti tersebut melalui salah satu input yang berpartisipasi dalam sistem properti Windows Runtime. Prioritas nilai properti dependensi ada sehingga sistem properti Windows Runtime dapat menghitung nilai dengan cara yang dapat diprediksi, dan penting bagi Anda untuk terbiasa dengan urutan prioritas dasar juga. Jika tidak, Anda mungkin menemukan diri Anda dalam situasi di mana Anda mencoba mengatur properti pada satu tingkat prioritas tetapi sesuatu yang lain (sistem, pemanggil pihak ketiga, beberapa kode Anda sendiri) mengaturnya di tingkat lain, dan Anda akan frustrasi mencoba mencari tahu nilai properti mana yang digunakan dan dari mana nilai itu berasal.

Misalnya, gaya dan templat dimaksudkan untuk menjadi titik awal bersama untuk menetapkan nilai properti dan dengan demikian munculnya kontrol. Tetapi pada instans kontrol tertentu Anda mungkin ingin mengubah nilainya versus nilai templat umum, seperti memberikan kontrol tersebut warna latar belakang yang berbeda atau string teks yang berbeda sebagai konten. Sistem properti Windows Runtime mempertimbangkan nilai lokal dengan prioritas yang lebih tinggi daripada nilai yang disediakan oleh gaya dan templat. Itu memungkinkan skenario memiliki nilai khusus aplikasi menimpa templat sehingga kontrol berguna untuk penggunaan Anda sendiri di UI aplikasi.

Daftar prioritas properti dependensi

Berikut ini adalah urutan definitif yang digunakan sistem properti saat menetapkan nilai run-time untuk properti dependensi. Prioritas tertinggi tercantum terlebih dahulu. Anda akan menemukan penjelasan yang lebih rinci hanya melewati daftar ini.

  1. Nilai animasi: Animasi aktif, animasi status visual, atau animasi dengan perilaku HoldEnd . Untuk memiliki efek praktis, animasi yang diterapkan ke properti harus lebih diutamakan daripada nilai dasar (tidak dianimasikan), bahkan jika nilai tersebut ditetapkan secara lokal.
  2. Nilai lokal: Nilai lokal mungkin diatur melalui kenyamanan pembungkus properti, yang juga sama dengan pengaturan sebagai atribut atau elemen properti di XAML, atau dengan panggilan ke metode SetValue menggunakan properti instans tertentu. Jika Anda menetapkan nilai lokal dengan menggunakan pengikatan atau sumber daya statis, masing-masing bertindak dalam prioritas seolah-olah nilai lokal ditetapkan, dan pengikatan atau referensi sumber daya dihapus jika nilai lokal baru ditetapkan.
  3. Properti templat: Elemen memiliki ini jika dibuat sebagai bagian dari templat (dari ControlTemplate atau DataTemplate).
  4. Setter gaya: Nilai dari Setter dalam gaya dari halaman atau sumber daya aplikasi.
  5. Nilai default: Properti dependensi dapat memiliki nilai default sebagai bagian dari metadatanya.

Properti templat

Properti templat sebagai item prioritas tidak berlaku untuk properti elemen apa pun yang Anda deklarasikan langsung di markup halaman XAML. Konsep properti templat hanya ada untuk objek yang dibuat ketika Windows Runtime menerapkan templat XAML ke elemen UI dan dengan demikian menentukan visualnya.

Semua properti yang diatur dari templat kontrol memiliki nilai semacam itu. Nilai-nilai ini hampir seperti sekumpulan nilai default yang diperluas untuk kontrol dan sering dikaitkan dengan nilai yang dapat Anda reset nanti dengan mengatur nilai properti secara langsung. Dengan demikian nilai yang ditetapkan templat harus dapat dibedakan dari nilai lokal yang sebenarnya, sehingga nilai lokal baru dapat menimpanya.

Catatan

Dalam beberapa kasus, templat mungkin mengambil alih bahkan nilai lokal, jika templat gagal mengekspos referensi ekstensi markup {TemplateBinding} untuk properti yang seharusnya dapat diatur pada instans. Ini biasanya dilakukan hanya jika properti benar-benar tidak dimaksudkan untuk diatur pada instans, misalnya jika hanya relevan dengan visual dan perilaku templat dan bukan untuk fungsi yang dimaksudkan atau logika runtime kontrol yang menggunakan templat.

Pengikatan dan prioritas

Operasi pengikatan memiliki prioritas yang sesuai untuk cakupan apa pun yang digunakan. Misalnya, {Binding} yang diterapkan ke nilai lokal bertindak sebagai nilai lokal, dan ekstensi markup {TemplateBinding} untuk setter properti berlaku seperti yang dilakukan setter gaya. Karena pengikatan harus menunggu hingga run-time untuk mendapatkan nilai dari sumber data, proses penentuan nilai properti yang diutamakan untuk properti apa pun juga diperpanjang menjadi run-time.

Tidak hanya pengikatan yang beroperasi pada prioritas yang sama dengan nilai lokal, mereka benar-benar adalah nilai lokal, di mana pengikatan adalah tempat penampung untuk nilai yang ditangguhkan. Jika Anda memiliki pengikatan untuk nilai properti, dan Anda menetapkan nilai lokal pada run-time, yang menggantikan pengikatan sepenuhnya. Demikian pula, jika Anda memanggil SetBinding untuk menentukan pengikatan yang hanya muncul pada run-time, Anda mengganti nilai lokal apa pun yang mungkin telah Anda terapkan di XAML atau dengan kode yang dijalankan sebelumnya.

Animasi papan cerita dan nilai dasar

Animasi papan cerita bertindak berdasarkan konsep nilai dasar. Nilai dasar adalah nilai yang ditentukan oleh sistem properti menggunakan prioritasnya, tetapi menghilangkan langkah terakhir mencari animasi. Misalnya, nilai dasar mungkin berasal dari templat kontrol, atau mungkin berasal dari pengaturan nilai lokal pada instans kontrol. Bagaimanapun, menerapkan animasi akan menimpa nilai dasar ini dan menerapkan nilai animasi selama animasi Anda terus berjalan.

Untuk properti animasi, nilai dasar masih dapat berpengaruh pada perilaku animasi, jika animasi tersebut tidak secara eksplisit menentukan Dari dan Ke, atau jika animasi mengembalikan properti ke nilai dasarnya ketika selesai. Dalam kasus ini, setelah animasi tidak lagi berjalan, sisa prioritas digunakan lagi.

Namun, animasi yang menentukan perilaku Kepada dengan HoldEnd dapat menggantikan nilai lokal hingga animasi dihapus, bahkan ketika secara visual tampaknya dihentikan. Secara konseptual ini seperti animasi yang berjalan selamanya bahkan jika tidak ada animasi visual di UI.

Beberapa animasi dapat diterapkan ke satu properti. Masing-masing animasi ini mungkin telah didefinisikan untuk menggantikan nilai dasar yang berasal dari titik yang berbeda dalam nilai prioritas. Namun, animasi ini semua akan berjalan secara bersamaan pada waktu proses, dan itu sering berarti bahwa mereka harus menggabungkan nilai mereka karena setiap animasi memiliki pengaruh yang sama pada nilai. Ini tergantung pada persis bagaimana animasi didefinisikan, dan jenis nilai yang sedang dianimasikan.

Untuk informasi selengkapnya, lihat Animasi storyboarded.

Nilai default

Menetapkan nilai default untuk properti dependensi dengan nilai PropertyMetadata dijelaskan secara lebih rinci dalam topik Properti dependensi kustom .

Properti dependensi masih memiliki nilai default meskipun nilai default tersebut tidak ditentukan secara eksplisit dalam metadata properti tersebut. Kecuali telah diubah oleh metadata, nilai default untuk properti dependensi Windows Runtime umumnya adalah salah satu dari yang berikut ini:

  • Properti yang menggunakan objek run-time atau jenis Objek dasar ( jenis referensi) memiliki nilai default null. Misalnya, DataContextnull hingga sengaja diatur atau diwariskan.
  • Properti yang menggunakan nilai dasar seperti angka atau nilai Boolean ( jenis nilai) menggunakan default yang diharapkan untuk nilai tersebut. Misalnya, 0 untuk bilangan bulat dan angka floating-point, false untuk Boolean.
  • Properti yang menggunakan struktur Windows Runtime memiliki nilai default yang diperoleh dengan memanggil konstruktor default implisit struktur tersebut. Konstruktor ini menggunakan default untuk setiap bidang nilai dasar struktur. Misalnya, default untuk nilai Titik diinisialisasi dengan nilai X dan Y-nya sebagai 0.
  • Properti yang menggunakan enumerasi memiliki nilai default dari anggota pertama yang ditentukan dalam enumerasi tersebut. Periksa referensi untuk enumerasi tertentu untuk melihat apa nilai defaultnya.
  • Properti yang menggunakan string (System.String untuk .NET, Platform::String untuk C++/CX) memiliki nilai default string kosong ("").
  • Properti koleksi biasanya tidak diimplementasikan sebagai properti dependensi, karena alasan yang dibahas lebih lanjut dalam topik ini. Tetapi jika Anda menerapkan properti koleksi kustom dan Anda ingin properti tersebut menjadi properti dependensi, pastikan untuk menghindari singleton yang tidak disengaja seperti yang dijelaskan di dekat akhir properti dependensi Kustom.

Fungsionalitas properti yang disediakan oleh properti dependensi

Pengikatan data

Properti dependensi dapat memiliki nilainya yang ditetapkan melalui penerapan pengikatan data. Pengikatan data menggunakan sintaks ekstensi markup {Binding} di XAML, ekstensi markup {x:Bind} atau kelas Pengikatan dalam kode. Untuk properti terikat data, penentuan nilai properti akhir ditangguhkan hingga durasi. Pada saat itu nilai diperoleh dari sumber data. Peran yang dimainkan sistem properti dependensi di sini adalah mengaktifkan perilaku tempat penampung untuk operasi seperti memuat XAML ketika nilai belum diketahui, dan kemudian memasok nilai pada durasi dengan berinteraksi dengan mesin pengikatan data Windows Runtime.

Contoh berikut mengatur nilai Teks untuk elemen TextBlock , menggunakan pengikatan di XAML. Pengikatan menggunakan konteks data yang diwariskan dan sumber data objek. (Tidak satu pun dari ini ditampilkan dalam contoh yang dipersingkat; untuk sampel yang lebih lengkap yang menunjukkan konteks dan sumber, lihat Pengikatan data secara mendalam.)

<Canvas>
  <TextBlock Text="{Binding Team.TeamName}"/>
</Canvas>

Anda juga dapat membuat pengikatan menggunakan kode daripada XAML. Lihat SetBinding.

Catatan

Pengikatan seperti ini diperlakukan sebagai nilai lokal untuk tujuan prioritas nilai properti dependensi. Jika Anda menetapkan nilai lokal lain untuk properti yang awalnya memiliki nilai Pengikatan , Anda akan menimpa pengikatan sepenuhnya, bukan hanya nilai run-time pengikatan. {x:Bind} Pengikatan diimplementasikan menggunakan kode yang dihasilkan yang akan menetapkan nilai lokal untuk properti . Jika Anda menetapkan nilai lokal untuk properti yang menggunakan {x:Bind}, maka nilai tersebut akan diganti saat pengikatan dievaluasi lagi, seperti saat mengamati perubahan properti pada objek sumbernya.

Sumber pengikatan, target pengikatan, peran FrameworkElement

Untuk menjadi sumber pengikatan, properti tidak perlu menjadi properti dependensi; Anda umumnya dapat menggunakan properti apa pun sebagai sumber pengikatan, meskipun ini tergantung pada bahasa pemrograman Anda dan masing-masing memiliki kasus tepi tertentu. Namun, untuk menjadi target ekstensi markup {Binding} atau Pengikatan, properti tersebut harus menjadi properti dependensi. {x:Bind} tidak memiliki persyaratan ini karena menggunakan kode yang dihasilkan untuk menerapkan nilai pengikatannya.

Jika Anda membuat pengikatan dalam kode, perhatikan bahwa API SetBinding hanya ditentukan untuk FrameworkElement. Namun, Anda dapat membuat definisi pengikatan menggunakan BindingOperations sebagai gantinya, dan dengan demikian mereferensikan properti DependencyObject apa pun.

Untuk kode atau XAML, ingatlah bahwa DataContext adalah properti FrameworkElement . Dengan menggunakan bentuk pewarisan properti induk-anak (biasanya dibuat dalam markup XAML), sistem pengikatan dapat menyelesaikan DataContext yang ada pada elemen induk. Pewarisan ini dapat mengevaluasi meskipun objek anak (yang memiliki properti target) bukan FrameworkElement dan karenanya tidak menyimpan nilai DataContext-nya sendiri. Namun, elemen induk yang diwariskan harus merupakan FrameworkElement untuk mengatur dan menahan DataContext. Atau, Anda harus menentukan pengikatan sehingga dapat berfungsi dengan nilai null untuk DataContext.

Pengabelan pengikatan bukan satu-satunya hal yang diperlukan untuk sebagian besar skenario pengikatan data. Agar pengikatan satu arah atau dua arah efektif, properti sumber harus mendukung pemberitahuan perubahan yang menyebar ke sistem pengikatan dan dengan demikian target. Untuk sumber pengikatan kustom, ini berarti bahwa properti harus merupakan properti dependensi, atau objek harus mendukung INotifyPropertyChanged. Koleksi harus mendukung INotifyCollectionChanged. Kelas tertentu mendukung antarmuka ini dalam implementasinya sehingga berguna sebagai kelas dasar untuk skenario pengikatan data; contoh kelas tersebut adalah ObservableCollection<T>. Untuk informasi selengkapnya tentang pengikatan data dan bagaimana pengikatan data terkait dengan sistem properti, lihat Pengikatan data secara mendalam.

Catatan

Jenis yang tercantum di sini mendukung sumber data Microsoft .NET. Sumber data C++/CX menggunakan antarmuka yang berbeda untuk pemberitahuan perubahan atau perilaku yang dapat diamati, lihat Pengikatan data secara mendalam.

Gaya dan template

Gaya dan templat adalah dua skenario untuk properti yang didefinisikan sebagai properti dependensi. Gaya berguna untuk mengatur properti yang menentukan UI aplikasi. Gaya didefinisikan sebagai sumber daya di XAML, baik sebagai entri dalam koleksi Sumber Daya , atau dalam file XAML terpisah seperti kamus sumber daya tema. Gaya berinteraksi dengan sistem properti karena berisi setter untuk properti. Properti yang paling penting di sini adalah properti Control.Template dari Kontrol: properti ini mendefinisikan sebagian besar tampilan visual dan status visual untuk Kontrol. Untuk informasi selengkapnya tentang gaya, dan beberapa contoh XAML yang menentukan Gaya dan menggunakan setter, lihat Kontrol gaya.

Nilai yang berasal dari gaya atau templat adalah nilai yang ditangguhkan, mirip dengan pengikatan. Ini agar pengguna kontrol dapat membuat ulang kontrol templat atau mendefinisikan ulang gaya. Dan itulah sebabnya setter properti dalam gaya hanya dapat bertindak pada properti dependensi, bukan properti biasa.

Animasi papan cerita

Anda dapat menganimasikan nilai properti dependensi menggunakan animasi papan cerita. Animasi papan cerita di Windows Runtime bukan hanya dekorasi visual. Lebih berguna untuk menganggap animasi sebagai teknik mesin status yang dapat mengatur nilai properti individual atau semua properti dan visual kontrol, dan mengubah nilai-nilai ini dari waktu ke waktu.

Untuk dianimasikan, properti target animasi harus merupakan properti dependensi. Selain itu, untuk dianimasikan, jenis nilai properti target harus didukung oleh salah satu jenis animasi turunan Garis Waktu yang ada. Nilai Warna, Ganda , dan Titik dapat dianimasikan menggunakan teknik interpolasi atau keyframe. Sebagian besar nilai lain dapat dianimasikan menggunakan bingkai kunci Objek diskrit.

Saat animasi diterapkan dan berjalan, nilai animasi beroperasi pada prioritas yang lebih tinggi daripada nilai apa pun (seperti nilai lokal) yang dimiliki properti. Animasi juga memiliki perilaku HoldEnd opsional yang dapat menyebabkan animasi diterapkan ke nilai properti meskipun animasi tampaknya dihentikan secara visual.

Prinsip mesin status diwujudkan oleh penggunaan animasi papan cerita sebagai bagian dari model status VisualStateManager untuk kontrol. Untuk informasi selengkapnya tentang animasi papan cerita, lihat Animasi papan cerita. Untuk informasi selengkapnya tentang VisualStateManager dan menentukan status visual untuk kontrol, lihat Animasi papan cerita untuk status visual atau templat Kontrol.

Perilaku yang diubah properti

Perilaku yang diubah properti adalah asal bagian "dependensi" dari terminologi properti dependensi. Mempertahankan nilai yang valid untuk properti ketika properti lain dapat memengaruhi nilai properti pertama adalah masalah pengembangan yang sulit dalam banyak kerangka kerja. Dalam sistem properti Windows Runtime, setiap properti dependensi dapat menentukan panggilan balik yang dipanggil setiap kali nilai propertinya berubah. Panggilan balik ini dapat digunakan untuk memberi tahu atau mengubah nilai properti terkait, secara umum sinkron. Banyak properti dependensi yang ada memiliki perilaku yang diubah properti. Anda juga dapat menambahkan perilaku panggilan balik serupa ke properti dependensi kustom, dan menerapkan panggilan balik yang diubah properti Anda sendiri. Lihat Properti dependensi kustom misalnya.

Windows 10 memperkenalkan metode RegisterPropertyChangedCallback. Ini memungkinkan kode aplikasi untuk mendaftar pemberitahuan perubahan ketika properti dependensi yang ditentukan diubah pada instans DependencyObject.

Nilai default dan ClearValue

Properti dependensi dapat memiliki nilai default yang didefinisikan sebagai bagian dari metadata propertinya. Untuk properti dependensi, nilai defaultnya tidak menjadi tidak relevan setelah properti diatur untuk pertama kalinya. Nilai default mungkin berlaku lagi pada run-time setiap kali beberapa penentu lain dalam prioritas nilai menghilang. (Prioritas nilai properti dependensi dibahas di bagian berikutnya.) Misalnya, Anda mungkin sengaja menghapus nilai gaya atau animasi yang berlaku untuk properti, tetapi Anda ingin nilainya menjadi default yang wajar setelah melakukannya. Nilai default properti dependensi dapat memberikan nilai ini, tanpa perlu secara khusus menetapkan nilai setiap properti sebagai langkah tambahan.

Anda dapat dengan sengaja mengatur properti ke nilai default bahkan setelah Anda mengaturnya dengan nilai lokal. Untuk mengatur ulang nilai menjadi default lagi, dan juga untuk mengaktifkan peserta lain diutamakan yang mungkin mengambil alih nilai default tetapi bukan lokal, panggil metode ClearValue (referensikan properti untuk menghapus sebagai parameter metode). Anda tidak selalu ingin properti secara harfiah menggunakan nilai default, tetapi menghapus nilai lokal dan kembali ke nilai default mungkin mengaktifkan item lain diutamakan yang ingin Anda bertindak sekarang, seperti menggunakan nilai yang berasal dari setter gaya dalam templat kontrol.

DependencyObject dan threading

Semua instans DependencyObject harus dibuat pada utas UI yang terkait dengan Jendela saat ini yang ditampilkan oleh aplikasi Windows Runtime. Meskipun setiap DependencyObject harus dibuat pada utas UI utama, objek dapat diakses menggunakan referensi dispatcher dari utas lain, dengan mengakses properti Dispatcher . Kemudian Anda dapat memanggil metode seperti RunAsync pada objek CoreDispatcher , dan menjalankan kode Anda dalam aturan pembatasan utas pada utas UI.

Aspek utas DependencyObject relevan karena umumnya berarti bahwa hanya kode yang berjalan pada utas UI yang dapat berubah atau bahkan membaca nilai properti dependensi. Masalah utas biasanya dapat dihindari dalam kode UI khas yang memanfaatkan pola asinkron dan utas pekerja latar belakang dengan benar. Anda biasanya hanya mengalami masalah threading terkait DependencyObject jika Anda mendefinisikan jenis DependencyObject Anda sendiri dan Anda mencoba menggunakannya untuk sumber data atau skenario lain di mana DependencyObject belum tentu sesuai.

Materi konseptual