Поделиться через


Практическое руководство. Переопределение метаданных для свойств зависимости

В этом примере демонстрируется переопределение метаданных свойства зависимости по умолчанию зависимости, взятых из наследованного класса, с помощью вызова метода OverrideMetadata и предоставления метаданных определенного типа.

Пример

Путем определения PropertyMetadata класс может определить поведение свойства зависимости, например, обратные вызовы значения по умолчанию и системы свойств. Многие классы свойства зависимости уже имеют метаданные по умолчанию, установленные как часть процесса их регистрации. Это включает свойства зависимости, которые являются частью WPF API. Класс, который наследует свойство зависимости через наследование, может переопределить исходные метаданные, так что характеристики свойства, которые могут изменяться через метаданные, будут соответствовать любым особым требованиям подкласса.

Переопределение метаданных в свойстве зависимости должно быть выполнена для этого свойства, используемого системой свойств (это соответствует случаю, когда создаются определенные экземпляры объектов, регистрирующие свойство). Вызов 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

Основные понятия

Общие сведения о свойствах зависимости

Пользовательские свойства зависимостей

Другие ресурсы

Разделы пошагового руководства по свойствам