2011-01-25 21 views

Respuesta

7
public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj) 
{ 
    List<DependencyProperty> result = new List<DependencyProperty>(); 

    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, 
     new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.All) })) 
    { 
     DependencyPropertyDescriptor dpd = 
      DependencyPropertyDescriptor.FromProperty(pd); 

     if (dpd != null) 
     { 
      result.Add(dpd.DependencyProperty); 
     } 
    } 

    return result; 
} 

encontrar aquí: http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c

+0

Gracias, Pavlo. Funciona. – Dennis

5

Usted puede utilizar la reflexión, a través de los GetFields, método para encontrar todas las propiedades estáticas públicas en Cuadro de texto. A continuación, puede utilizar un LINQ cláusula WHERE para filtrar estos a cualquier tipo de DependencyProperty:

var flags = BindingFlags.Static | 
       BindingFlags.FlattenHierarchy | 
       BindingFlags.Public; 
    var dependencyProperties = typeof(TextBox).GetFields(flags) 
        .Where(f => f.FieldType == typeof(DependencyProperty)); 

continuación, usted puede transformar esta a una lista de nombres a través de un Select:

var dependencyProperties = typeof(TextBox).GetFields(flags) 
        .Where(f => f.FieldType == typeof(DependencyProperty)) 
        .Select(dp => dp.Name); 

Nota: cada nombre tiene un sufijo 'Propiedad', por supuesto puede eliminar esto en la cláusula Select anterior si lo desea.

+0

+1 para 'BindingFlags.FlattenHierarchy'. El mío no lo tiene. – Aliostad

+0

Esta solución no es buena. Consulte este tema en MSDN: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d47114a7-b182-485c-b1dd-1078ddd42be9/. Ver el comentario de Dr.WPF. – Dennis

+0

Con respecto a los comentarios de Dr.WPFs, (1) Claro, la reflexión es lenta, pero es la única forma de hacerlo, si la velocidad es un problema, guarde en caché los resultados. (2) El método anterior no se basa en la presencia de accesadores CLR, por lo que no es un problema, (3) Este método también encontrará propiedades adjuntas. – ColinE

1

Si desea escuchar el nombre de los DependencyProperties de un elemento entonces usted puede hacer esto:

var results = from prop in typeof(element).GetFields() 
        where prop.FieldType == typeof(DependencyProperty) 
        select prop.Name.Substring(0, prop.Name.Length - 8); 

donde 8 es la longitud de la cadena "Propiedad", que aparece al final de una propiedad de dependencia!

0

Trate

 var fieldInfos = typeof(TextBox).GetFields(BindingFlags.Public | BindingFlags.Static).Where(x=>x.FieldType == typeof(DependencyProperty)); 
     foreach (var fieldInfo in fieldInfos) 
     { 
      Console.WriteLine(fieldInfo.Name); 
     } 
6

El uso de reflexión no se necesita (y una mala en mi humilde opinión idead) ya que el marco tiene ya clases de utilidad para esto (pero no son evidentes para encontrar :-).

Aquí es una respuesta basada en este artículo: Enumerate Bindings y la LocalValueEnumerator Structure

public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(this DependencyObject obj) 
    { 
     if (obj != null) 
     { 
      LocalValueEnumerator lve = obj.GetLocalValueEnumerator(); 
      while (lve.MoveNext()) 
      { 
       yield return lve.Current.Property; 
      } 
     } 
    } 

Aquí hay otra respuesta basada en este otro artículo: Getting list of all dependency/attached properties of an Object que utiliza MarkupWriter.GetMarkupObjectFor Method.

public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(object element) 
    { 
     if (element != null) 
     { 
      MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element); 
      if (markupObject != null) 
      { 
       foreach (MarkupProperty mp in markupObject.Properties) 
       { 
        if (mp.DependencyProperty != null) 
         yield return mp.DependencyProperty; 
       } 
      } 
     } 
    } 

    public static IEnumerable<DependencyProperty> EnumerateAttachedProperties(object element) 
    { 
     if (element != null) 
     { 
      MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element); 
      if (markupObject != null) 
      { 
       foreach (MarkupProperty mp in markupObject.Properties) 
       { 
        if (mp.IsAttached) 
         yield return mp.DependencyProperty; 
       } 
      } 
     } 
    } 
Cuestiones relacionadas