c# - 初始化时触发自定义 DependencyProperty 的 PropertyChangedCallback

标签 c# wpf dependency-properties

我正在实现一个 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/

相关文章:

c# - 如何使用 vs2010 在 Sql Server 2012 中运行 SSIS 包?

c# - 子触发器也运行父触发器吗?

c# - 64 位 Windows 上的 DirectX 应用程序

c# - WPF 应用程序上的闪烁按钮

c# - 具有可选匹配组的正则表达式

c# - 如何在给定的日期/时间从休眠状态中醒来?

c# - Process.Start() 问题 - 未显示 GUI

wpf - 从 XAML 绑定(bind)到自定义依赖属性

wpf - DependencyProperty.Register() 或 .RegisterAttached()

wpf - 如何将另一个 DependencyProperty 绑定(bind)到 CheckBox 的 IsChecked 属性?