了解 XAML 中是不是未设置 DependencyProperty

Posted

技术标签:

【中文标题】了解 XAML 中是不是未设置 DependencyProperty【英文标题】:Knowing if a DependencyProperty has not been set in XAML了解 XAML 中是否未设置 DependencyProperty 【发布时间】:2013-11-16 20:45:38 【问题描述】:

我有一个控件,它公开了一个名为 PlacementTarget 的 DP(它绑定到一个子 Popup FWIW)。

我想要做的是,如果 PlacementTarget 未在 XAML 中设置,那么(控件将)将其设置为控件所在的窗口。当我说“未设置”时,我的意思不仅仅是“为空” (这允许用户 dev 将 PlacementTarget 设置为 null,并且控件不会自动将其设置为 Window)。

我有一个名为 placementTargetIsSet 的字段,我在 Change 事件处理程序中将其设置为 true

public readonly static DependencyProperty PlacementTargetProperty =
    DependencyProperty.Register(
        "PlacementTarget", typeof(UIElement), typeof(MyControl),
        new PropertyMetadata(new PropertyChangedCallback(PlacementTargetChanged)));

static void PlacementTargetChanged(
    DependencyObject sender, DependencyPropertyChangedEventArgs e)

    MyControl ctrl = (sender as MyControl);
    ctrl.placementTargetIsSet = true;


public UIElement PlacementTarget

    get  return (UIElement)GetValue(PlacementTargetProperty); 
    set  SetValue(PlacementTargetProperty, value); 

但是,我发现更改的事件发生在 OnApplyTemplate 和 Loaded 事件之后。即当 OnApplyTemplate 或 Loaded 发生时,placementTargetIsSet==false,无论 PlacementTarget 是否已设置(在 XAML 中)。

那么我什么时候可以安全地假设 PlacementTarget 尚未设置?

【问题讨论】:

【参考方案1】:

您不需要额外的 placementTargetIsSet 字段,因此不需要 PropertyChangedCallback。

为了确定是否为PlacementTarget 属性设置了值,您只需调用ReadLocalValue 方法并测试它是否返回DependencyProperty.UnsetValue:

bool placementTargetIsSet =
    ReadLocalValue(PlacementTargetProperty) != DependencyProperty.UnsetValue;

【讨论】:

我迟到了,但我不能感谢你的回答。它刚刚解决了我一年左右的一个问题,它使用一个帮助类来设置网格中所有元素的属性。 哇... 在 WPF 中工作了好几年。从来不知道这种方法存在。 如果您有一个具有自定义样式的控件,则 不起作用。我所有的属性都是Unset,即使是那些有绑定的.. @DominicJonas 它不应该与样式设置器中的值一起使用,因为它们不是 local 值。 @Clemens 啊,那我理解错了。是否也可以知道它是否设置在xaml中?否则我必须选择带有 propChanged 和 bool 标志的解决方法。

以上是关于了解 XAML 中是不是未设置 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章

如何在设计时避免 XAML 代码中的“对象引用未设置为对象的实例”异常?

VBA 中是不是有办法了解未使用的变量?

纯文本属性在XAML中基于工作日设置textBlock前景

XAML:图像未正确居中

XAML 设计器未显示在 Visual Studio 版本 16.10.2 中

法语/葡萄牙语Numero字符未正确呈现在XAML中