Bagikan melalui


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 publicstaticreadonly 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

Baca juga