Obtención de DependencyProperty por nombre para WPF y Silverlight
¿Alguna vez ha necesitado crear enlaces a elementos sin conocer o tener acceso a su DependencyProperty hasta el tiempo de ejecución?
¿Alguna vez ha tenido la necesidad de obtener DependencyProperty de un elemento en tiempo de ejecución por algún motivo? Si es así, este fragmento de código puede serle útil.
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;
}
El uso es sencillo. Un método permite pasar la instancia del objeto de dependencia, además de la representación de cadena de DependencyProperty en el objeto. El otro método permite obtener un objeto de dependencia de un Type. Lo más importante que hay que recordar es que el parámetro dpName es el nombre completo de DependencyProperty tal y como se declara, no el nombre de propiedad al que se hace referencia en el código o XAML.
Considere el siguiente ejemplo:
var usingInstance = GetDependencyPropertyByName(_button, "ContentProperty"); var usingType = GetDependencyPropertyByName(typeof(Button), "ContentProperty");
Como puede ver, el parámetro dpName es el nombre real de DependencyProperty (ContentProperty) y no el nombre de la propiedad (Content). Ahora que tiene DepedencyProperty, puede obtener todo tipo de metadatos sobre la propiedad e incluso crear enlaces de datos dinámicos. Espero que esto sea útil.