Можно ли изменить значение DescriptionAttribute унаследованного DependencyProperty в производном классе? - PullRequest
2 голосов
/ 17 марта 2012

Если я создаю класс, который расширяет UserControl и хочет установить значение по умолчанию для DependencyProperty, которое объявлено в UserControl, скажем FontSize, я могу добавить статический конструктор, как показано ниже:

static MyUserControl()
{
    UserControl.FontSizeProperty.OverrideMetadata(typeof(MyUserControl), 
new FrameworkPropertyMetadata(28.0));
}

До того, как я узнал о методе OverrideMetadata, я использовал для переопределения свойства и установки DescriptionAttribute следующим образом:

public new static readonly DependencyProperty FontSizeProperty = 
DependencyProperty.Register("FontSize", typeof(double), typeof(MyUserControl), 
new PropertyMetadata(28.0));

[Description("My custom description."), Category("Text")]
public new double FontSize
{
    get { return (double)GetValue(FontSizeProperty); }
    set { SetValue(FontSizeProperty, value); }
}

Значение DescriptionAttribute отображается как всплывающая подсказка в окне свойств Visual Studio, когда пользователь перемещает указатель мыши над соответствующим именем свойства. У меня вопрос: возможно ли установить значение DescriptionAttribute для этого DependencyProperty аналогично переопределению метаданных? Или я должен буду сохранить свойство getter / setter CLR и объявление атрибута?

Большое спасибо заранее.

1 Ответ

2 голосов
/ 21 марта 2012

Я обнаружил, что могу получить доступ к значению DescriptionAttribute унаследованного свойства типа, но только из конструктора экземпляра, а не статического конструктора, потому что мне нужна ссылка на объект управления. Кроме того, я не мог установить его, используя этот метод, так как это было свойство только для чтения:

AttributeCollection attributes = 
    TypeDescriptor.GetProperties(this)["FontSize"].Attributes;
DescriptionAttribute attribute = 
    (DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
attribute.Description = "Custom description"; // not possible - read only property

Затем я обнаружил, что нельзя изменить объявленные значения атрибутов во время выполнения из этих статей:

  1. Можно ли динамически добавлять атрибуты в C #?
  2. Программно добавить атрибут к методу или параметру

Поэтому я буду продолжать объявлять свойства оболочки CLR с новыми значениями DescriptionAttribute и переопределять метаданные в статическом конструкторе просто для установки новых значений по умолчанию.

...