Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<b>// FrameworkElement "является" DependencyObject.</b>public class FrameworkElement : UIElement, IFrameworkInputElement, IInputElement, ISupportInitialize, IHaveResources, IQueryAmbient{ ...<b> // Статическое поле только для чтения типа DependencyProperty.</b> public static readonly DependencyProperty HeightProperty;<b> // Поле DependencyProperty часто регистрируется</b><b> // в статическом конструкторе класса.</b> static FrameworkElement() { ... HeightProperty = DependencyProperty.Register( "Height", typeof(double), typeof(FrameworkElement), new FrameworkPropertyMetadata((double) 1.0 / (double) 0.0, FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(FrameworkElement.OnTransformDirty)), new ValidateValueCallback(FrameworkElement.IsWidthHeightValid)); }<b> // Оболочка CLR, реализованная с использованием</b><b> // унаследованных методов GetValue()/SetValue().</b> public double Height { get { return (double) base.GetValue(HeightProperty); } set { base.SetValue(HeightProperty, value); } }}Как видите, по сравнению с обычными свойствами CLR свойства зависимости требуют немалого объема дополнительного кода. В реальности зависимость может оказаться даже еще более сложной, чем показано здесь (к счастью, многие реализации проще свойства
HeightВ первую очередь вспомните, что если в классе необходимо определить свойство зависимости, то он должен иметь в своей цепочке наследования
DependencyObjectGetValue()SetValue()FrameworkElementDependencyObjectДалее вспомните, что сущность, где действительно хранится значение свойства (значение
doubleHeightDependencyPropertyPropertypublic static readonly DependencyProperty HeightProperty;Учитывая, что свойства зависимости объявляются как статические поля, они обычно создаются (и регистрируются) внутри статического конструктора класса. Объект
DependencyPropertyDependencyProperty.Register()HeightHeightProperty = DependencyProperty.Register( "Height", typeof(double), typeof(FrameworkElement), new FrameworkPropertyMetadata((double)0.0, FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(FrameworkElement.OnTransformDirty)), new ValidateValueCallback(FrameworkElement.IsWidthHeightValid));Первым аргументом, передаваемым методу
DependencyProperty.Register()HeightdoubleFrameworkElementHeightPropertyFrameworkElementЧетвертый аргумент, передаваемый методу
DependencyProperty.Register()FrameworkPropertyMetadataFrameworkPropertyMetadataFrameworkPropertyMetadataOptionsFrameworkPropertyMetadatanew FrameworkPropertyMetadata( // Стандартное значение свойства. (double)0.0, // Параметры метаданных. FrameworkPropertyMetadataOptions.AffectsMeasure, // Делегат, который указывает на метод, // вызываемый при изменении свойства.