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?
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.