Aracılığıyla paylaş


Nasıl yapılır: Bağımlılık Özelliği için Meta Verileri Geçersiz Kılma

Bu örnekte, yöntemini çağırarak ve türe özgü meta veriler sağlayarak devralınan bir sınıftan gelen varsayılan bağımlılık özelliği meta verilerinin OverrideMetadata nasıl geçersiz kılındığı gösterilir.

Örnek

sınıfı, öğesini PropertyMetadatatanımlayarak bağımlılık özelliğinin varsayılan değeri ve özellik sistemi geri çağırmaları gibi davranışlarını tanımlayabilir. Birçok bağımlılık özelliği sınıfı, kayıt işlemlerinin bir parçası olarak önceden oluşturulmuş varsayılan meta verilerine sahiptir. Bu, WPF API'sinin parçası olan bağımlılık özelliklerini içerir. Bağımlılık özelliğini sınıf devralma yoluyla devralan bir sınıf, özgün meta verileri geçersiz kılabilir, böylece meta veriler aracılığıyla değiştirilebilen özelliğin özellikleri alt sınıfa özgü gereksinimlerle eşleşecektir.

Bir bağımlılık özelliğindeki meta verilerin geçersiz kılınması, bu özelliğin özellik sistemi tarafından kullanılmadan önce yapılması gerekir (bu, özelliği kaydeden nesnelerin belirli örneklerinin örneği oluşturma zamanına eşit olur). çağrısıOverrideMetadata, parametresi OverrideMetadataolarak forType kendisini sağlayan türün statik oluşturucuları içinde gerçekleştirilmelidir. Sahip türü örnekleri mevcut olduğunda meta verileri değiştirmeye çalışırsanız, bu özel durum oluşturmaz, ancak özellik sisteminde tutarsız davranışlara neden olur. Ayrıca meta veriler tür başına yalnızca bir kez geçersiz kılınabilir. Aynı türdeki meta verileri geçersiz kılmaya yönelik sonraki girişimler özel durum oluşturur.

Aşağıdaki örnekte, özel sınıf MyAdvancedStateControl tarafından sağlanan StatePropertyMyStateControl meta verileri yeni özellik meta verileriyle geçersiz kılar. Örneğin, özelliğinin StateProperty varsayılan değeri artık true özelliği yeni yapılandırılmış MyAdvancedStateControl bir örnekte sorgulandığında olur.

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

Ayrıca bkz.