2012-04-23 94 views
1

我正在實現一個布爾型DependencyProperty,它在設置爲true時將一個裝飾器添加到DependencyObject。我希望DependencyProperty的默認值爲true,但這樣做不會觸發PropertyChangedCallback,因此默認情況下不會創建裝飾器。有沒有辦法讓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 2012-04-23 15:49:19

+0

我一直很好奇,因爲文檔中的示例沒有顯示DependencyProperty定義的類,所以不清楚ownerType的設置是什麼。奇怪的是,我已經有一些行爲,我將ownerType參數設置爲我希望屬性應用到的類,並且它沒有給我任何問題,我可以在XAML中設置屬性。我將不得不通過代碼並修復這些代碼。謝謝克萊門斯! – 2012-04-23 16:03:11

回答

2

除支持值繼承的附加屬性外,沒有默認值自動應用於樹中的所有元素。

正常附加屬性(無繼承)的值不會應用於任何元素,除非您明確設置了該屬性。當屬性未明確設置在元素上時,獲取附加屬性的值將從元數據返回默認值。

如果您在Canvas中沒有設置Canvas.Left的元素,則Canvas將從元數據中獲取默認值Canvas.Left 0。元素本身沒有這個值。

因此,在您的情況下,您將不得不申請IsAdorned,因此默認值必須爲false

相關問題