2010-08-17 66 views
0

我有一個對象(裝飾),它定義了它的任何孩子的附加屬性。複雜的附加屬性行爲

到目前爲止,我沒有任何問題,設置/獲取遠程對象上的附加屬性:

 public static readonly DependencyProperty RequiresRoleProperty = 
      DependencyProperty.RegisterAttached("RequiresRole", typeof (string), typeof (UIElement), 
               new FrameworkPropertyMetadata(
                null, 
                FrameworkPropertyMetadataOptions.AffectsRender, 
                OnSetRequiresRole)); 
     [AttachedPropertyBrowsableForChildrenAttribute(IncludeDescendants=true)] 
     public static string GetRequiresRole(UIElement element) 
     { 
      return element.GetValue(RequiresRoleProperty) as string; 
     } 

     public static void SetRequiresRole(UIElement element, string val) 
     { 
      element.SetValue(RequiresRoleProperty, val); 
     } 

不過,我有一個OnSetCallback設立這個附加屬性,以使我的設置邏輯,但是我需要引用裝飾器(MyClass)這個元素是它的一個子元素。

在回調的類型signiature:

void Callback(DependencyObject d, DependencyPropertyChagnedEventArgs args)

  • d是爲其附加屬性被設定的對象。
  • args.NewValue & args.OldValue是財產的實際價值。

收集對附屬屬性所屬元素的引用的最佳方式是什麼?

回答

2

您可以在Visual Tree中查找您的裝飾器類型,從d開始。這是一個簡單的方法,您可以使用:

public static T FindAncestor<T>(DependencyObject dependencyObject) 
    where T : class 
{ 
    DependencyObject target = dependencyObject; 
    do 
    { 
     target = VisualTreeHelper.GetParent(target); 
    } 
    while (target != null && !(target is T)); 
    return target as T; 
}