次のコードがあります。PropertyChanged イベントが呼び出されていますが、ゲッターとセッターは呼び出されていません。私は一生、理由がわかりません。同じことが起こっている他のプロパティがありますが、値が設定されています。それが違いを生む場合、これはカスタムコントロールです。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 は正常に動作しているようです。"right" に設定されている Placement 添付プロパティの既定値が無視されています。これを XAML で設定しても、まだ機能しません。ただし、値を上、左、または下に設定すると、ツールチップが正しい場所に表示されます。