كيفية القيام بما يلي: تجاوز بيانات التعريف الخاصة بالخاصية التبعية
يوضح هذا المثال كيفية تجاوز بيانات التعريف الخاصة بالخاصية التبعية الافتراضية التي تأتي من فئة موروثة عن طريق استدعاء الأسلوب OverrideMetadata وتوفير بيانات تعريف من نوع خاص.
مثال
بواسطة تعريف الـ PropertyMetadata الخاصة بفئة، يمكن للفئة تعريف السلوكيات الخاصة بخاصية تبعية dependency property ، ويرجع قيمته الافتراضية وخاصية النظام. يكون للعديد من فئات الخاصية التبعية بيانات التعريف الافتراضية موجودة كجزء من عملية التسجيل الخاصة بها. ويتضمن هذا خصائص التبعية التي هى جزء من WPFAPI. يمكن للفئة التى ترث الخاصية التبعية من خلال التوارث الخاص بها أن تتجاوز بيانات التعريف الأصلية بحيث تتماشى الصفات المميزة للخاصية التى يمكن أن تتغير من خلال بيانات التعريف مع أي متطلبات خاصة لفئة فرعية.
تجاوز بيانات التعريف لخاصية تبعية يجب أن تتم قبل أن يتم تبديل تلك الخاصية المستخدمة من قبل النظام (ذلك مساويًا الوقت الذى تقوم فيه مثيلات محددة من الكائنات بتسجيل الخاصية بإنشاء مثيل). يجب أن تتم استرجاعات OverrideMetadata داخل المُنشئات الثابتة من النوع الذى يوفر لنفسه المتغير forType الخاص بـ OverrideMetadata. إذا حاولت تغيير بيانات التعريف بمجرد وجود مثيلات من الخاصة بالمالك لن يتم حدوث استثناءات ولكن سيؤدي الى سلوكيات غير متناسقة في نظام الخاصية. أيضاً، بيانات التعريف يمكن فقط تجاوزها مرة واحدة لكل نوع. المحاولات اللاحقة لتجاوز بيانات التعريف على نفس نوع سوف تقوم بإصدار استثناء.
في المثال التالي، الفئة المخصصة MyAdvancedStateControl تتجاوز بيانات التعريف الموفرة لـ StateProperty بواسطة MyAdvancedStateControl مع بيانات تعريف خاصية جديدة. على سبيل المثال، القيمة الافتراضية لـ StateProperty هى الآن true عندما يتم الاستعلام عن الخاصية على مثيل MyAdvancedStateControl مكون حديثاً.
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
Inherits MyStateControl
Public Sub New()
MyBase.New()
End Sub
Shared Sub New()
MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
End Sub
End Class
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 MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}