Как ограничить Attached Properties только дочерними элементами одного контейнерного класса? - PullRequest
0 голосов
/ 18 мая 2011

Учитывая приведенный ниже код, как можно обогатить класс, чтобы ограничить это присоединенное свойство только дочерними элементами одного точного контейнера (назовем его «класс MyContainer»)), просто так, как обстоят дела с Canvas X и Y, а также Grid Column и Row прикрепили свойства.

public class MyAttachedPropertyClass
{
    public static readonly DependencyProperty MyAttachedProperty;
    static MyAttachedPropertyClass()
    {
        MyAttachedProperty= DependencyProperty.RegisterAttached("MyAttached",
                                                            typeof(MyProperty),
                                                            typeof(MyAttachedPropertyClass),
                                                            new PropertyMetadata(null);
    }

    public static MyProperty GetTitleText(DependencyObject obj)
    {
        return (MyProperty)obj.GetValue(MyAttachedProperty);
    }

    public static void SetTitleText(DependencyObject obj, MyProperty value)
    {
        obj.SetValue(MyAttachedProperty, value);
    }
}

}

1 Ответ

1 голос
/ 18 мая 2011

Присоединенные свойства BY DEFINITION могут быть присоединены к любому классу, который реализует DependencyObject.

Вы можете изменить реализацию геттеров и сеттеров следующим образом:

public static MyProperty GetTitleText(MyContainer obj)
{
    return (MyProperty)obj.GetValue(MyAttachedProperty);
}

public static void SetTitleText(MyContainer obj, MyProperty value)
{
    obj.SetValue(MyAttachedProperty, value);
}

поэтому они будут нацелены только на MyContainer, но это не поможет, поскольку настоящая работа выполняется в базовом объекте obj.SetValue / obj.GetValue, который WPF будет вызывать напрямую много раз.

Лучшее решение - использовать для определения Behavior<MyContainer>, который может быть присоединен ТОЛЬКО к MyContainer. Поведения - это просто изощренные и более элегантные свойства Attached, так что все остальное останется почти таким же.

...