Bagikan melalui


Cara: Mengganti Metadata untuk Properti Dependensi

Contoh ini menunjukkan cara mengambil alih metadata properti dependensi default yang berasal dari kelas yang diwariskan, dengan memanggil OverrideMetadata metode dan menyediakan metadata khusus jenis.

Contoh

Dengan mendefinisikan PropertyMetadata, kelas dapat menentukan perilaku properti dependensi, seperti nilai default dan panggilan balik sistem propertinya. Banyak kelas properti dependensi sudah memiliki metadata default yang ditetapkan sebagai bagian dari proses pendaftaran mereka. Ini termasuk properti dependensi yang merupakan bagian dari API WPF. Kelas yang mewarisi properti dependensi melalui warisan kelasnya dapat mengambil alih metadata asli sehingga karakteristik properti yang dapat diubah melalui metadata akan cocok dengan persyaratan khusus subkelas apa pun.

Mengambil alih metadata pada properti dependensi harus dilakukan sebelum properti tersebut ditempatkan dalam penggunaan oleh sistem properti (ini sama dengan waktu instans objek tertentu yang mendaftarkan properti dibuat). Panggilan ke OverrideMetadata harus dilakukan dalam konstruktor statis dari jenis yang menyediakan dirinya sebagai forType parameter .OverrideMetadata Jika Anda mencoba mengubah metadata setelah instans jenis pemilik ada, ini tidak akan menimbulkan pengecualian, tetapi akan mengakibatkan perilaku yang tidak konsisten dalam sistem properti. Selain itu, metadata hanya dapat ditimpa sekali per jenis. Upaya berikutnya untuk mengambil alih metadata pada jenis yang sama akan menimbulkan pengecualian.

Dalam contoh berikut, kelas MyAdvancedStateControl kustom mengambil alih metadata yang disediakan StateProperty oleh MyStateControl metadata properti baru. Misalnya, nilai StateProperty default sekarang true adalah ketika properti dikueri pada instans yang baru dibangun MyAdvancedStateControl .

public class MyStateControl : ButtonBase
{
  public MyStateControl() : base() { }
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); }
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
Public Class MyStateControl
    Inherits ButtonBase
  Public Sub New()
      MyBase.New()
  End Sub
  Public Property State() As Boolean
    Get
        Return CType(Me.GetValue(StateProperty), Boolean)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(StateProperty, value)
    End Set
  End Property
  Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
public class MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}
Public Class MyAdvancedStateControl
    Inherits MyStateControl
  Public Sub New()
      MyBase.New()
  End Sub
  Shared Sub New()
    MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
  End Sub
End Class

Baca juga