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