2014-07-11 152 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 

在我来说,我更改属性为只读,把它内部设置通过这种方法。