我创建了一个名为Period的类,该类放置在名为Timetable的UserControl中。我已经为Period创建了一个名为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')
任何帮助将不胜感激,谢谢。
您可以使用Period.Parent来获取容器。但是,由于时间表是UserControl,因此只会返回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
就我而言,我将该属性更改为只读,并通过此方法在内部进行了设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句