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


Как переопределить метаданные для свойства зависимости

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

Пример

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

Прежде чем свойство зависимости будет использоваться системой свойств, необходимо переопределить его метаданные (это совпадает с моментом, когда создаются конкретные экземпляры объектов, регистрирующих это свойство). Вызовы к OverrideMetadata должны выполняться в статических конструкторах того типа, который предоставляет себя в качестве параметра forType для OverrideMetadata. Если вы попытаетесь изменить метаданные, когда уже существуют экземпляры типа владельца, это не приведет к возникновению исключений, но приведет к несогласованному поведению в системе свойств. Кроме того, метаданные можно переопределить для каждого типа только один раз. Последующие попытки переопределить метаданные одного типа вызовут исключение.

В следующем примере, настраиваемый класс MyAdvancedStateControl переопределяет метаданные, которые были предоставлены для StateProperty, с помощью новых метаданных свойства от MyStateControl. Например, значение по умолчанию StateProperty теперь true, когда запрашивается значение свойства в только что созданном экземпляре 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

См. также