依赖属性未设置

时间:2014-07-11 16:19:41

标签: wpf vb.net data-binding dependency-properties

我创建了一个名为 Period 的类,它被放置在名为时间表的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>

如您所见,我已将Period的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 个答案:

答案 0 :(得分:0)

您可以使用Period.Parent来获取容器。但是,由于Timetable是UserControl,这只会返回immidete容器而不是UserControl的实例。因此,如果UserControl由两个网格组成,则在另一个Period.Parent内部将返回Grid而不是Timetable。

要解决此问题,您可以检查父母是否是时间表,如果不是另一个级别,请再次检查。循环直到它的类型正确。

以下是代码:

    Dim TimetableObject As DependencyObject
    TimetableObject = Me.Parent

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

在我的情况下,我将属性更改为只读,并通过此方法在内部设置。