我有一个控件,它暴露了一个叫做PlacementTarget的DP(它绑定到一个子Popup,FWIW)。我想要做的是,如果在XAML中未设置PlacementTarget,则(该控件会)将其设置为该控件所在的窗口。当我说“未设置”时,我不是指“为空”(这允许用户开发人员将PlacementTarget设置为null,而控件不会自动将其设置为窗口)。
我有一个名为placementTargetIsSet的字段,在Change事件处理程序中将其设置为true。
我有一个名为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尚未设置?
xaml
中?否则我就得选择使用 propChanged 和 bool 标志的解决方法。 - Dominic Jonas