2010-08-17 7 views
0

J'ai un objet (Décorateur) qui définit une propriété attachée pour l'un de ses enfants.Comportement d'une propriété liée complexe

Jusqu'à présent, je n'ai aucune question mise en/obtenir la propriété attachée sur l'objet distant:

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

Cependant, j'ai un OnSetCallback mis en place pour cette propriété attachée à si ma logique de configuration, mais je besoin d'une référence au décorateur (MyClass) cet élément est un enfant de.

Dans le type signiature du rappel:

void Callback(DependencyObject d, DependencyPropertyChagnedEventArgs args)

  • d est l'objet pour lequel la propriété est définie ci-joint.
  • args.NewValue & args.OldValue est la valeur réelle de la propriété.

Quelle est la meilleure façon de collecter une référence à l'élément conteneur auquel la propriété jointe appartient?

Répondre

2

Vous pouvez parcourir l'arbre visuel à la recherche de votre type de décorateur, en commençant par d. Ceci est une méthode simple que vous pouvez utiliser:

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