我正在实现一个 bool DependencyProperty,当它设置为 true 时,它会向 DependencyObject 添加一个装饰器。我希望 DependencyProperty 的默认值为 true,但这样做不会触发 PropertyChangedCallback,因此默认情况下不会创建装饰器。有没有办法让 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));
}
}
最佳答案
除了支持值继承的附加属性之外,没有自动应用于树中所有元素的默认值。
除非您显式设置该属性,否则普通附加属性(无继承)的值不会应用于任何元素。当未在元素上显式设置属性时,获取附加属性的值将从元数据返回默认值。
例如,如果 Canvas 中有一个元素没有设置 Canvas.Left
,则 Canvas 将从元数据中获取 Canvas.Left
的默认值 0。元素本身根本没有这个值。
因此,在您的场景中,您无论如何都必须应用 IsAdorned
,因此默认值必须为 false
。
关于c# - 初始化时触发自定义 DependencyProperty 的 PropertyChangedCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10283607/