在初始化时触发自定义DependencyProperty的PropertyChangedCallback

时间:2012-04-23 15:31:56

标签: c# wpf dependency-properties

我正在实现一个布尔值DependencyProperty,当它被设置为true时,它会向DependencyObject添加一个装饰器。我希望DependencyProperty的默认值为true,但这样做不会触发PropertyChangedCallback,因此默认情况下不会创建adorner。有没有办法在初始化时激活PropertyChangedCallback?

public static bool GetIsAdorned(DependencyObject obj)
{
    return (bool)obj.GetValue(IsAdornedProperty);
}

public static void SetIsAdorned(DependencyObject obj, bool value)
{
    obj.SetValue(IsAdornedProperty, value);
}

public static readonly DependencyProperty IsAdornedProperty =
       DependencyProperty.RegisterAttached("IsAdorned",
       typeof(bool),
       typeof(UIElement),
       new UIPropertyMetadata(true, OnIsAdornedChanged));

private static void OnIsAdornedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    var uiElement = dependencyObject as UIElement;
    var newValue = (bool)e.NewValue;
    var adornerLayer = AdornerLayer.GetAdornerLayer(uiElement);

    if (newValue)
    {
        adornerLayer.Add(new MyAdorner(uiElement));
    }
}

1 个答案:

答案 0 :(得分:2)

除了支持值继承的附加属性外,没有自动应用于树中所有元素的默认值。

除非您明确设置该属性,否则普通附加属性(没有继承)的值不会应用于任何元素。当未在元素上显式设置属性时,获取附加属性的值将从元数据返回默认值。

如果您在Canvas中有一个元素而没有设置Canvas.Left,那么Canvas将从元数据中获取Canvas.Left的默认值为0。元素本身没有这个值。

因此,在您的方案中,您无论如何都必须应用IsAdorned,因此默认值必须为false