2014-07-11 259 views
1

我創建了一個名爲的類,它放在UserControl中,名爲時間表。我爲創建了一個依賴項屬性,時間段爲,名爲ContainingTimetable,這樣Period就可以訪問其包含時間表的屬性。未設置依賴項屬性

這裏是依賴屬性:

Public Shared ReadOnly ContainingTimetableProperty As DependencyProperty = DependencyProperty.Register(
    "ContainingTimetable", GetType(Timetable), GetType(Period), new PropertyMetadata(Nothing)) 

Public Property ContainingTimetable As Timetable 
    Get 
     Return DirectCast(GetValue(ContainingTimetableProperty), Timetable) 
    End Get 
    Set 
     SetValue(ContainingTimetableProperty, Value) 
     Debug.WriteLine("Timetable has been set") 
    End Set 
End Property 

以下是控制在XAML:

<local:Timetable Margin="50,25,21,68" UseLayoutRounding="True" PixelToMinuteRatio="2" StartTime="9:00" x:Name="Timetable1"> 

    <local:Period Background="#72000000" VerticalAlignment="Top" Day="Sunday" StartTime="9:00" 
         EndTime="10:20" Margin="0,0,1,0" ContainingTimetable="{Binding ElementName=Timetable1}"/> 

</local:Timetable> 

正如你可以看到我已綁定的時期ContainingTimetable屬性Timetable1。但是,當我運行該程序時,ContainingTimetable屬性從未在期間設置。我也得到這個錯誤:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=Timetable1'. BindingExpression:(no path); DataItem=null; target element is 'Period' (Name=''); target property is 'ContainingTimetable' (type 'Timetable') 

任何幫助將不勝感激,謝謝。

+1

如果'Timetable'派生自FrameworkElement,則可以簡單地使用['Parent'](http://msdn.microsoft.com/zh-cn/library/system.windows.frameworkelement.parent.aspx)屬性。此外,屬性設置器和因此'Debug.WriteLine'可能永遠不會被調用。請參閱[這裏](http://msdn.microsoft.com/en-us/library/bb613563.aspx)的解釋。 – Clemens

+0

@Clemens謝謝你的建議,但是當我得到它的父類時,Timetable是一個UserControl它返回一個Grid。我明確知道它沒有被設置,因爲當我引用ContainingTimetable時,我得到一個NullReferenceException。 – Ivel97

+1

對不起,我的意思是當然期。時間表將是期間的父母。 – Clemens

回答

0

您可以使用Period.Parent來獲取容器。但是,由於時間表是一個用戶控件,這隻會返回immidete容器而不是UserControl的實例。因此,如果UserControl由兩個網格組成,一個在另一個網格內,則Period.Parent將返回一個網格而不是時間表。

爲了解決這個問題,你可以檢查父母是否是一個時間表,如果它沒有升到另一個級別,再次檢查。循環播放直到它是正確的類型。

下面是代碼:

Dim TimetableObject As DependencyObject 
    TimetableObject = Me.Parent 

    Do While (Not TimetableObject.GetType() = GetType(WPFTimetableCreator.Timetable)) 
     TimetableObject = VisualTreeHelper.GetParent(TimetableObject) 
    Loop 

在我來說,我更改屬性爲只讀,把它內部設置通過這種方法。