Практическое руководство. Добавление типа владельца для свойства зависимости
В этом примере показано, как добавить класс в качестве владельца свойства зависимостей, зарегистрированного для другого типа. В результате этого как читатель 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
См. также
.NET Desktop feedback