c# - 了解是否尚未在 XAML 中设置 DependencyProperty

标签 c# wpf xaml controls dependency-properties

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

我想做的是,如果 PlacementTarget 未在 XAML 中设置,那么(控件将)将其设置为控件所在的窗口。当我说“未设置”时,我的意思并不是简单地“为空” (这允许用户开发人员将 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 尚未设置?

最佳答案

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

为了查明是否为 PlacementTarget 属性设置了值,您可以调用 ReadLocalValue方法并测试它是否返回 DependencyProperty.UnsetValue :

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

关于c# - 了解是否尚未在 XAML 中设置 DependencyProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798104/

相关文章:

c# - 为什么我可以在 web.config 中有多个相同的绑定(bind)重定向?

c# - 调用线程无法访问此对象,因为另一个线程拥有它

wpf - 如何将参数从 Xaml 传递给按钮工具的命令对象?

wpf - 在 XAML 中设置 TextBox 的宽度,以便它能够显示 x 位

wpf - 有什么办法可以提取底层Xaml吗?

c# - 在没有回发的情况下重置 ASP.NET 中的页面

c# - 在 .NET 4.0 WinForms 应用程序中使用 POS.NET 失败

c# - C#ElasticSearch NEST聚合:分组依据

wpf - MVVM:ado.net Entity Framework 和模型

c# - Areo Glass Effect 和 windowStyle 设置为 none 会导致窗口调整大小无法正常运行