知道是否在XAML中设置了DependencyProperty

Jim*_*ica 6 c# wpf xaml controls dependency-properties

我有一个控件,它暴露了一个名为PlacementTarget的DP(它绑定到子弹出FWIW).

我想要做的是如果没有在XAML中设置PlacementTarget,那么(控件将)将它设置为控件所在的Window.当我说'not set'时,我并不仅仅意味着'is null'(这允许用户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); }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Cle*_*ens 14

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

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

bool placementTargetIsSet =
    ReadLocalValue(PlacementTargetProperty) != DependencyProperty.UnsetValue;
Run Code Online (Sandbox Code Playgroud)