Как определить, реализует ли объект зависимости заданное свойство зависимости (C # / WPF) - PullRequest
1 голос
/ 22 апреля 2010

Я работаю с классами в пространстве имен System.Windows.Documents, пытаясь написать некоторый универсальный код, который будет условно устанавливать значение определенных свойств зависимости в зависимости от того, существуют ли эти свойства в данном классе.

Например, следующий метод присваивает произвольное значение свойству Padding переданного FrameworkContentElement:

void SetElementPadding(FrameworkContentElement element)
{
    element.SetValue(Block.PaddingProperty, new Thickness(155d));
}

Однако не все конкретные реализации FrameworkContentElement имеют свойство Padding (Paragraph имеет, но Span не имеет), поэтому я ожидаю, что присвоение свойства будет успешным для типов, которые реализуют это свойство, и будет молча игнорируется для типов, которые этого не делают.

Но, похоже, что указанное выше назначение свойства успешно выполняется для экземпляров всех производных FrameworkContentElement, независимо от того, реализуют ли они свойство Padding. Я делаю это предположение, потому что мне всегда удавалось прочитать присвоенное значение.

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

Большое спасибо за ваш совет.

Тим

1 Ответ

1 голос
/ 23 апреля 2010

Все классы, производные от Block, имеют свойство Padding. Вы можете использовать следующую модификацию:

void SetElementPadding(FrameworkContentElement element)
{
    var block = element as Block;
    if (block == null) return;

    block.Padding = new Thickness(155d);
}

Даже без этой модификации все будет работать для вас, потому что все, что вы хотите, это чтобы Padding игнорировался классами, которые его не поддерживают. Это именно то, что случилось бы. Тот факт, что вы можете считывать значение свойства зависимостей Padding для экземпляра, который его не поддерживает, вероятно, является задуманностью, но вам не следует об этом беспокоиться. Блок и производные будут уважать значение, а все остальные будут игнорировать его.

...