Практическое руководство. Переопределение метаданных для свойств зависимостей
В этом примере показано, как переопределить метаданные свойства зависимостей по умолчанию, которое поступает из наследуемого класса, путем вызова OverrideMetadata с указанием конкретного типа метаданных.
Пример
Определив его PropertyMetadata, класс может определить поведение свойства зависимости, например, значение и свойство системы обратные вызовы по умолчанию. Многие классы свойств зависимостей уже имеют метаданные по умолчанию, заданные во время процесса их регистрации. К ним относятся свойства зависимостей, которые являются частью API WPF. Класс, который наследует свойство зависимости при наследовании класса, может переопределить исходные метаданные, так что характеристики свойства, которые могут изменяться посредством метаданных, будут соответствовать любым особым требованиям подкласса.
Переопределение метаданных в свойстве зависимости должно быть выполнено до того, как свойство начнет использоваться системой свойств (то есть до того момента, когда будут созданы определенные экземпляры объектов, регистрирующие свойство). Вызовы OverrideMetadata должны быть выполнены в статических конструкторах типа, предоставляющего себя в качестве forType
параметр OverrideMetadata. При попытке изменить метаданные существующих экземпляров типа-владельца не возникнет исключения, но это приведет к несогласованному поведению системы свойств. Кроме того, метаданные могут переопределяться один раз для каждого типа. Последующие попытки переопределить метаданные для того же типа вызовут исключение.
В приведенном ниже примере пользовательский класс MyAdvancedStateControl
переопределяет метаданные, предоставленные свойству StateProperty
классом MyAdvancedStateControl
, новыми метаданными свойства. Например, значение 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 MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}