9

PlacementTarget と呼ばれる DP を公開するコントロールがあります (子ポップアップ FWIW にバインドされています)。

私がやりたいことは、PlacementTarget が XAML で設定されていない場合、(コントロールは) コントロールがあるウィンドウにそれを設定することです。ユーザー dev が PlacementTarget を null に設定すると、コントロールはそれを Window に自動設定しません)。

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 が発生すると、PlacementTarget が (XAML で) 設定されているかどうかに関係なく、placementTargetIsSet==false になります。

では、PlacementTarget が設定されていないと安全に判断できるのはいつでしょうか?

4

1 に答える 1

16

placementTargetIsSet追加のフィールドは必要ないため、PropertyChangedCallback は必要ありません。

PlacementTargetプロパティに値が設定されているかどうかを確認するには、 ReadLocalValueメソッドを呼び出して、 DependencyProperty.UnsetValueが返されるかどうかをテストします。

bool placementTargetIsSet =
    ReadLocalValue(PlacementTargetProperty) != DependencyProperty.UnsetValue;
于 2013-11-05T20:47:22.080 に答える