Properti Pemuatan dan Dependensi XAML
Implementasi WPF saat ini dari prosesor XAML-nya secara inheren menyadari properti dependensi. Prosesor WPF XAML menggunakan metode sistem properti untuk properti dependensi saat memuat XAML biner dan atribut pemrosesan yang merupakan properti dependensi. Ini secara efektif melewati pembungkus properti. Ketika Anda menerapkan properti dependensi kustom, Anda harus memperhitungkan perilaku ini dan harus menghindari penempatan kode lain di pembungkus GetValue properti Anda selain metode sistem properti dan SetValue.
Prasyarat
Topik ini mengasumsikan bahwa Anda memahami properti dependensi baik sebagai konsumen maupun penulis dan telah membaca Gambaran Umum Properti Dependensi dan Properti Dependensi Kustom. Anda juga harus membaca XAML dalam Sintaks WPF dan XAML Secara Rinci.
Implementasi dan Performa WPF XAML Loader
Untuk alasan implementasi, secara komputasi lebih murah untuk mengidentifikasi properti sebagai properti dependensi dan mengakses metode sistem SetValue properti untuk mengaturnya, daripada menggunakan pembungkus properti dan setternya. Hal ini karena prosesor XAML harus menyimpulkan seluruh model objek kode dukungan hanya berdasarkan mengetahui hubungan jenis dan anggota yang ditunjukkan oleh struktur markup dan berbagai string.
Jenis ini dicari melalui kombinasi xmln dan atribut assembly, tetapi mengidentifikasi anggota, menentukan mana yang dapat mendukung diatur sebagai atribut, dan menyelesaikan jenis apa yang didukung nilai properti jika tidak memerlukan refleksi ekstensif menggunakan PropertyInfo. Karena properti dependensi pada jenis tertentu dapat diakses sebagai tabel penyimpanan melalui sistem properti, implementasi WPF dari prosesor XAML-nya menggunakan tabel ini dan menyimpulkan bahwa properti tertentu ABC dapat diatur dengan lebih efisien dengan memanggil SetValue jenis turunan yang berisiDependencyObject, menggunakan pengidentifikasi properti dependensi ABCProperty.
Implikasi untuk Properti Dependensi Kustom
Karena implementasi WPF saat ini dari perilaku prosesor XAML untuk pengaturan properti melewati pembungkus sepenuhnya, Anda tidak boleh memasukkan logika tambahan ke dalam definisi yang ditetapkan dari pembungkus untuk properti dependensi kustom Anda. Jika Anda memasukkan logika tersebut dalam definisi yang ditetapkan, maka logika tidak akan dijalankan ketika properti diatur dalam XAML daripada dalam kode.
Demikian pula, aspek lain dari prosesor XAML yang mendapatkan nilai properti dari pemrosesan XAML juga menggunakan GetValue daripada menggunakan pembungkus. Oleh karena itu, Anda juga harus menghindari implementasi tambahan dalam get
definisi di luar GetValue panggilan.
Contoh berikut adalah definisi properti dependensi yang direkomendasikan dengan pembungkus, di mana pengidentifikasi properti disimpan sebagai public
static
readonly
bidang, dan get
definisi dan set
tidak berisi kode di luar metode sistem properti yang diperlukan yang menentukan pencadangan properti dependensi.
public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
"AquariumGraphic",
typeof(Uri),
typeof(AquariumObject),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnUriChanged)
)
);
public Uri AquariumGraphic
{
get { return (Uri)GetValue(AquariumGraphicProperty); }
set { SetValue(AquariumGraphicProperty, value); }
}
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
Get
Return CType(GetValue(AquariumGraphicProperty), Uri)
End Get
Set(ByVal value As Uri)
SetValue(AquariumGraphicProperty, value)
End Set
End Property
Lihat juga
.NET Desktop feedback
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk