2011-01-25 45 views

Trả lời

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; 
} 

Tìm thấy ở đây: http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c

+0

Xin cảm ơn, Pavlo. Nó hoạt động. – Dennis

5

Bạn có thể sử dụng phản chiếu, qua getFields, phương pháp để tìm tất cả các thuộc tính public static trên TextBox. Sau đó bạn có thể sử dụng một LINQ mệnh đề WHERE để lọc những đối với bất kỳ loại thuộc tính phụ thuộc:

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

Sau đó bạn có thể chuyển đổi này vào một danh sách các tên thông qua một Select:

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

Lưu ý: mỗi tên có hậu tố 'Thuộc tính', bạn có thể loại bỏ điều này trong mệnh đề Chọn ở trên nếu bạn muốn.

+0

+1 cho 'BindingFlags.FlattenHierarchy'. Tôi không có nó. – Aliostad

+0

Giải pháp này không tốt. Xem chủ đề này tại MSDN: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d47114a7-b182-485c-b1dd-1078ddd42be9/. Xem nhận xét của Dr.WPF. – Dennis

+0

Về các bình luận của Dr.WPF, (1) Chắc chắn, sự phản chiếu chậm, nhưng đó là cách duy nhất để làm điều này, nếu tốc độ là một vấn đề, hãy lưu lại kết quả. (2) Phương pháp trên không phụ thuộc vào sự hiện diện của CLR accessors, vì vậy đây không phải là vấn đề, (3) Phương pháp này cũng sẽ tìm các thuộc tính đính kèm. – ColinE

1

Nếu bạn muốn tên của DependencyProperties của một phần tử thì bạn có thể làm điều này:

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

nơi 8 là chiều dài của chuỗi "tài sản" xuất hiện ở phần cuối của một tài sản phụ thuộc!

0

Hãy thử

 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

dùng phản ánh là không cần thiết (và một idead IMHO xấu) vì khuôn khổ có đã lớp tiện ích cho việc này (nhưng chúng không rõ ràng để tìm :-).

Dưới đây là một câu trả lời dựa trên bài viết này: Enumerate BindingsLocalValueEnumerator Structure

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

Dưới đây là một câu trả lời dựa trên bài viết này khác: Getting list of all dependency/attached properties of an Object sử dụng 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; 
       } 
      } 
     } 
    } 
Các vấn đề liên quan