Практическое руководство. Переопределение метаданных для свойств зависимости
Обновлен: Ноябрь 2007
В этом примере демонстрируется переопределение метаданных свойства зависимости по умолчанию зависимости, взятых из наследованного класса, с помощью вызова метода OverrideMetadata и предоставления метаданных определенного типа.
Пример
Путем определения PropertyMetadata класс может определить поведение свойства зависимости, например, обратные вызовы значения по умолчанию и системы свойств. Многие классы свойства зависимости уже имеют метаданные по умолчанию, установленные как часть процесса их регистрации. Это включает свойства зависимости, которые являются частью WPFAPI-интерфейс. Класс, который наследует свойство зависимости через наследование, может переопределить исходные метаданные, так что характеристики свойства, которые могут изменяться через метаданные, будут соответствовать любым особым требованиям подкласса.
Переопределение метаданных в свойстве зависимости должно быть выполнена для этого свойства, используемого системой свойств (это соответствует случаю, когда создаются определенные экземпляры объектов, регистрирующие свойство). Вызов 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));
}
}
См. также
Основные понятия
Общие сведения о свойствах зависимости
Пользовательские свойства зависимостей