c# - Saber si una DependencyProperty no se ha establecido en XAML
wpf controls (1)
Tengo un control, que expone un DP llamado PlacementTarget (está vinculado a un niño emergente FWIW).
Lo que quiero hacer es si PlacementTarget no está configurado en XAML, entonces (el control) lo establecerá en la ventana donde está el control. Cuando digo ''no establecido'' no me refiero simplemente a ''es nulo'' (esto permite el usuario dev establecerá PlacementTarget como nulo, y el control no lo establecerá automáticamente en la ventana).
Tengo un campo llamado placementTargetIsSet, que establecí en true en el controlador de eventos Change
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); }
}
Sin embargo, estoy descubriendo que el evento cambiado está sucediendo DESPUÉS de OnApplyTemplate y el evento Loaded. es decir, cuando se produce OnApplyTemplate o Loaded, placementTargetIsSet == false, independientemente de si PlacementTarget se ha establecido o no (en XAML).
Entonces, ¿cuándo puedo suponer con seguridad que PlacementTarget no se ha establecido?
No necesita un campo adicional placementTargetIsSet
y, por lo tanto, no PropertyChangedCallback.
Para saber si se ha establecido un valor para la propiedad PlacementTarget
, puede llamar al método ReadLocalValue y probar si devuelve DependencyProperty.UnsetValue :
bool placementTargetIsSet =
ReadLocalValue(PlacementTargetProperty) != DependencyProperty.UnsetValue;