Ir para o conteúdo
Obter DependencyProperty por nome para WPF e Silverlight

Obter DependencyProperty por nome para WPF e Silverlight

Você já precisou criar associações a elementos sem conhecer ou ter acesso a sua DependencyProperty até o tempo de execução?

2min read

Você já teve a necessidade de obter o DependencyProperty de um elemento em tempo de execução por qualquer motivo?  Nesse caso, esse trecho de código pode ser útil para você.

public static DependencyProperty GetDependencyPropertyByName(DependencyObject dependencyObject, string dpName)
{
    return GetDependencyPropertyByName(dependencyObject.GetType(), dpName);
}

public static DependencyProperty GetDependencyPropertyByName(Type dependencyObjectType, string dpName)
{
    DependencyProperty dp = null;

    var fieldInfo = dependencyObjectType.GetField(dpName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
    if (fieldInfo != null)
    {
        dp = fieldInfo.GetValue(null) as DependencyProperty;
    }

    return dp;
}

O uso é simples.  Um método permite que você passe a instância do objeto de dependência, além da representação de cadeia de caracteres do DependencyProperty no objeto.  O outro método permite que você obtenha um objeto de dependência de um Type.  A coisa mais importante a lembrar é que o parâmetro dpName é o nome completo do DependencyProperty conforme ele é declarado, não o nome da propriedade que você referencia no código ou XAML.

Considere o seguinte exemplo:

var usingInstance = GetDependencyPropertyByName(_button, "ContentProperty");

var usingType = GetDependencyPropertyByName(typeof(Button), "ContentProperty");

Como você pode ver, o parâmetro dpName é o nome real da DependencyProperty (ContentProperty) e não o nome da propriedade (Content).  Agora que você tem a DepedencyProperty, pode obter todos os tipos de metadados sobre a propriedade e até mesmo criar associações de dados dinâmicas.  Espero que isso seja útil.

Solicite uma demonstração