2

次のコードがあります。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 で設定しても、まだ機能しません。ただし、値を上、左、または下に設定すると、ツールチップが正しい場所に表示されます。

4

3 に答える 3

7

XAML はメソッドSetValueGetValueメソッドを直接呼び出すため、静的Set/Getメソッドにロジックを配置するのではなく、代わりにプロパティ変更ハンドラーを使用する必要があります。

于 2013-05-23T19:27:41.370 に答える
7

SetterとはGetter、コーディング用の .NET ラッパーにすぎません。XAML からバインドする場合、 プロパティおよびではなくGetXXXXおよびが呼び出されます。SetXXXGetterSetter

コールバックにアクセスすることもできますDependencyProperty PropertyChanged。この関数は、プロパティが変更されるたびに呼び出されます。

于 2013-05-24T11:42:33.847 に答える