مشاركة عبر


كيفية القيام بما يلي: تجاوز بيانات التعريف الخاصة بالخاصية التبعية

يوضح هذا المثال كيفية تجاوز بيانات التعريف الخاصة بالخاصية التبعية الافتراضية التي تأتي من فئة موروثة عن طريق استدعاء الأسلوب 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));
  }
}

راجع أيضًا:

المرجع

DependencyProperty

المبادئ

نظرة عامة حول خصائص التبعية

خصائص التبعية المخصصة

موارد أخرى

مواضيع إجراءات الخصائص