2012-04-23 10 views
1

trueに設定すると、DependencyObjectにアドルナーを追加するboolean DependencyPropertyを実装しています。私はDependencyPropertyのデフォルト値をtrueにしたいが、PropertyChangedCallbackを起動しないので、デフォルトでadornerは作成されない。初期化時にPropertyChangedCallbackを呼び出す方法はありますか?カスタムDependencyPropertyのPropertyChangedCallbackを初期化で起動する

public static bool GetIsAdorned(DependencyObject obj) 
{ 
    return (bool)obj.GetValue(IsAdornedProperty); 
} 

public static void SetIsAdorned(DependencyObject obj, bool value) 
{ 
    obj.SetValue(IsAdornedProperty, value); 
} 

public static readonly DependencyProperty IsAdornedProperty = 
     DependencyProperty.RegisterAttached("IsAdorned", 
     typeof(bool), 
     typeof(UIElement), 
     new UIPropertyMetadata(true, OnIsAdornedChanged)); 

private static void OnIsAdornedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    var uiElement = dependencyObject as UIElement; 
    var newValue = (bool)e.NewValue; 
    var adornerLayer = AdornerLayer.GetAdornerLayer(uiElement); 

    if (newValue) 
    { 
     adornerLayer.Add(new MyAdorner(uiElement)); 
    } 
} 
+1

注:[カスタム添付プロパティ](http://msdn.microsoft.com/en-us/library/ms749011.aspx#custom)を作成する場合、RegisterAttachedの* ownerType *パラメータはクラスでなければなりませんそのプロパティを定義する**ではなく、プロパティを適用するクラスではありません(ここではUIElementではありません)。そうしないと、XAMLでプロパティを適用できなくなります。 – Clemens

+0

ドキュメントの例でDependencyPropertyが定義されているクラスが表示されていないので、ownerTypeがどのように設定されているのかは不明でした。奇妙なことは、プロパティを適用したいクラスにownerTypeパラメータを設定しても何の問題もなく、XAMLでプロパティを設定できることです。私はコードを通過し、それらを修正する必要があります。おかげでクレメンス! –

答えて

2

値の継承をサポートする添付プロパティを除いて、ツリーのすべての要素に自動的に適用されるデフォルト値はありません。

通常の添付プロパティ(継承なし)の値は、そのプロパティを明示的に設定しない限り、どの要素にも適用されません。プロパティが明示的に要素に設定されていない場合、添付プロパティの値を取得すると、メタデータから既定値が返されます。

たとえば、Canvasに要素Canvas.Leftを設定していない場合、CanvasはメタデータからCanvas.Leftのデフォルト値を0として取得します。要素自体には単にこの値はありません。

したがって、シナリオではIsAdornedを適用する必要があります。したがって、デフォルト値はfalseである必要があります。