Комплексная недвижимость - PullRequest
       1

Комплексная недвижимость

0 голосов
/ 18 августа 2010

У меня есть объект (Decorator), который определяет присоединенное свойство для любого из его дочерних элементов.

Пока у меня нет проблем с установкой / получением присоединенного свойства для удаленного объекта:

        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), дочерний элемент которого.

Втип подписи обратного вызова:

void Callback(DependencyObject d, DependencyPropertyChagnedEventArgs args)

  • d Объект, для которого установлено присоединенное свойство.
  • args.NewValue & args.OldValue - это фактическое значение свойства.

Каков наилучший способ сбора ссылки на содержащий элемент, которому принадлежит присоединенное свойство?

1 Ответ

2 голосов
/ 18 августа 2010

Вы можете пройтись по дереву визуалов в поисках типа вашего декоратора, начиная с 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;
}
...