2013-03-12 221 views
0

後,我有一個例子依賴項屬性定義是這樣的:訪問自定義依賴屬性的所有屬性PropertyChangedCallback

public Polyline Shape 
{ 
    get { return (Polyline)GetValue(ShapeProperty); } 
    set { SetValue(ShapeProperty, value); } 
} 

public static readonly DependencyProperty ShapeProperty = 
DependencyProperty.Register("Shape", typeof(Polyline), 
typeof(CustomControl), new FrameworkPropertyMetadata(null, 
FrameworkPropertyMetadataOptions.AffectsRender, onShapeAdded)); 

我設置這樣的:

<local:CustomControl> 
    <local:CustomControl.Shape> 
     <Polyline Points="0,180 0,80 70,80 90,180 0,180" /> 
    </local:CustomControl.Shape> 
</local:CustomControl> 

它的回調看起來是這樣的:

private static void onShapeAdded(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    Polyline control = (Polyline)e.NewValue; 
    //control.Points is always null 
} 

爲什麼Points回收在回調期間始終爲空? (它發生在每一個屬性)在最後的點設置,所以我想我很快訪問我的控制,但是什麼時候以及如何訪問控制與它的所有屬性設置?

回答

0

您的onShapeAdded方法實際上是PropertyChangedCallback的事件處理函數,意思是當Shape屬性更改時它將觸發。當添加Polyline時,以及Points屬性初始化之前,此更改顯然正在啓動。

您可以嘗試通過將Polyline定義爲資源來解決此問題,這意味着它將在添加到控件之前進行初始化。例如:

<Window.Resources> 
    <Polyline x:Key="myPolyline" Points="0,180 0,80 70,80 90,180 0,180" /> 
</Window.Resources> 

<local:CustomControl Shape="{DynamicResource myPolyline}"/> 

我相信Polyline將被完全初始化,如果以這種方式添加的話。

+0

是的,這絕對是一個解決方法,但在我的情況下,我將添加幾個CustomControls和定義大約5個帶有唯一鍵的多段線並綁定它們看起來不太好。必須有更好的方式 – labm0nkey 2013-03-13 11:20:55

+0

爲什麼這看起來不好?它實際上並不具有約束力 - 使用資源與綁定不同。 XAML實際上更簡單,更易維護(所有'Polylines'都是在一個地方定義的)。如果你希望它更接近,你可以在CustomControl的Resources中定義'Polylines'。也許我不瞭解你的總體目標。我能想到的唯一的另一個選擇是將一個監聽器附加到OnShapeAdded方法中的「折線」上,以偵聽對「折線」的「點」屬性的更改。 – 2013-03-13 15:41:26

+0

我已經添加了監聽器,甚至是我的Polyline的'Loaded',在那裏我正在檢查我的Points和其他屬性 – labm0nkey 2013-03-14 10:43:57