Практическое руководство. Добавление типа владельца для свойства зависимости

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

В следующем примере StateProperty — это свойство, зарегистрированное классом MyStateControl. Класс UnrelatedStateControl добавляет себя в качестве владельца StateProperty с помощью метода AddOwner, в частности, с помощью сигнатуры, которая позволяет создавать новые метаданные для свойства зависимостей в том виде, в котором оно существует в добавляющем типе. Обратите внимание, что необходимо предоставить методы доступа среды CLR для свойства аналогично примеру Реализация свойства зависимостей, а также повторно предоставить идентификатор свойства зависимостей для класса, добавляемого в качестве владельца.

Без программ-оболочек свойство зависимостей по-прежнему будет работать с точки зрения программного доступа с помощью GetValue или SetValue. Однако, как правило, требуется параллель между поведением системы свойств и программами-оболочками свойств CLR. Программы-оболочки упрощают программную настройку свойства зависимостей и позволяют задавать свойства как атрибуты XAML.

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

Пример

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 UnrelatedStateControl : Control
{
  public UnrelatedStateControl() { }
  public static readonly DependencyProperty StateProperty = MyStateControl.StateProperty.AddOwner(typeof(UnrelatedStateControl), new PropertyMetadata(true));
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); }
  }
}
Public Class UnrelatedStateControl
    Inherits Control
  Public Sub New()
  End Sub
  Public Shared ReadOnly StateProperty As DependencyProperty = MyStateControl.StateProperty.AddOwner(GetType(UnrelatedStateControl), New PropertyMetadata(True))
  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
End Class

См. также