【问题标题】:Firing custom DependencyProperty's PropertyChangedCallback on initialize在初始化时触发自定义 DependencyProperty 的 PropertyChangedCallback
【发布时间】:2025-12-27 11:40:11
【问题描述】:

我正在实现一个布尔 DependencyProperty,它在 DependencyObject 设置为 true 时添加一个装饰器。我希望 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));
    }
}

【问题讨论】:

  • 请注意:当您创建custom attached property 时,RegisterAttached 中的 ownerType 参数必须是您定义该属性的类,不是您要应用该属性的类(即此处不是 UIElement)。否则,您将无法在 XAML 中应用该属性。
  • 我确实一直想知道这一点,因为文档中的示例没有显示定义 DependencyProperty 的类,因此不清楚 ownerType 设置为什么。奇怪的是,我已经有一些行为,我将 ownerType 参数设置为我希望属性应用到的类,它没有给我任何问题,而且我能够在 XAML 中设置属性。我将不得不检查代码并修复它们。谢谢克莱门斯!

标签: c# wpf dependency-properties


【解决方案1】:

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

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

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

因此,在您的场景中,无论如何您都必须应用IsAdorned,因此默认值必须是false

【讨论】: