我有以下代码。正在调用 PropertyChanged 事件,但未调用 getter 和 setter。我不能为我的生活明白为什么不。我有其他属性正在发生同样的事情,但正在设置值。这是一个自定义控件,如果有什么不同的话。当我在 get/set 处设置断点时,我什么也得不到。但是,propertychanged 正在返回正确的值。任何帮助是极大的赞赏。
/// <summary>
/// Identifies the PlacementTarget dependency property.
/// </summary>
public static readonly DependencyProperty PlacementTargetProperty =
DependencyProperty.RegisterAttached(
"PlacementTarget",
typeof(UIElement),
typeof(FunctionPanel),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, PlacementTargetPropertyChanged)
);
/// <summary>
/// Gets or setsthe PlacementTarget of tooltips for all child controls.
/// </summary>
public UIElement PlacementTarget
{
get { return (UIElement)GetValue(PlacementTargetProperty); }
set { SetValue(PlacementTargetProperty, value); }
}
/// <summary>
/// Sets the value of the PlacementTarget dependency property.
/// </summary>
/// <param name="target">Target object.</param>
/// <param name="value">Value argument.</param>
public static void SetPlacementTarget(DependencyObject target, UIElement value)
{
target.SetValue(PlacementTargetProperty, value);
}
/// <summary>
/// Gets the value of the PlacementTarget dependency property.
/// </summary>
/// <param name="target">Target object.</param>
public static UIElement GetPlacementTarget(DependencyObject target)
{
return (UIElement)target.GetValue(PlacementTargetProperty);
}
/// <summary>
/// This method is called when the PlacementTarget dependency property changes value.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event arguments.</param>
private static void PlacementTargetPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
ToolTipService.SetPlacementTarget(sender, (UIElement)e.NewValue);
}
附加信息
所以基本上 PlacementTargetPropertyChanged 处理得很好。我想问题是这个特定的 DP 实际上并没有传播给孩子们。这是 XAML 片段:
<controls:FunctionPanel BetweenShowDelay="0"
InitialShowDelay="500"
IsError="False"
Message="MESSAGE"
Placement="Right"
PlacementTarget="{Binding RelativeSource={RelativeSource Self}}"
ShowDuration="60000" />
除 PlacementTarget 之外的所有 DP 都在访问子元素。我试过删除绑定,但没有任何区别。
我正在通过使用 Snoop 检查值来验证其他 DP。我创建了一个 Int 类型的 InitialShowDelay DP。当我将该值设置为 5000 时,所有子控件都会继承该值,并且工具提示会在出现前延迟 5 秒。我可以通过在我的 PlacementTargetPropertyChanged 方法上放置一个断点来验证绑定是否发送了正确的控件。
更新 1
所以看来 PlacementTarget 工作正常。我的 Placement 附加属性的默认值设置为“right”,将被忽略。当我通过 XAML 设置它时,它仍然不起作用。但是,如果我将值设置为 Top、Left 或 Bottom,工具提示会出现在正确的位置。