最佳实践:处理从 child object 到 parent object、grandparent object 等的传递命令 VBNET
Best Practice: handle passing commands from child object to parent object, grandparent object, etc. VBNET
我有一个 parent 控件,它实例化了 children 控件,它又可以进一步实例化 children。将命令或值从 grand-child 返回到顶部 parent 控件的最佳方法是什么?考虑这个例子:
child 控件有一个删除自身的按钮。但是实际删除的方法,从 GUI 中删除等,都是由顶部 parent 出于必要来处理的。
以下是我为此提供的两种方法,它们都有效:
- 当 parent 实例化 child 时,它会将对自身的引用传递给 child。这让 child 现在可以调用 parent 的 public 成员。在代码中,这看起来像:
'*~*~*~*~*~*~*~*~*~*~
'in the parent object
Dim child as new ChildObject
child.setParent(me)
'*~*~*~*~*~*~*~*~*~*~
'in the child object
public sub setParent(byref p as parentObject)
myParent = p
end sub
'now the child can interact with the parent
'for example:
myParent.deleteMe()
这适用于只有一个层次深度的情况。但是如果你有多个级别,它会很笨拙,你会做类似的事情:
myParent.myParent.myParent.deleteMe()
不酷。
- 我促成的另一种方法是使用 public 变量,该变量由顶部 parent 中的高速计时器监控。如果 child 需要一些 parent 方法 运行,那么它会将一个布尔值标记为 TRUE,计时器会监视它,然后调用适当的方法。但这需要一个 public 变量,我宁愿避免使用它。该方法还使用了一个耗资源的连续计时器。
问题:
这些是可以接受的实现目标的方法吗?有没有更好的办法?或者我什至需要这样做表明整体设计缺陷的事实?
我对 WPF 的工作不多,但我相信您可以使用 VisualTreeHelper.GetParent Method 来 向上移动 可视化树以找到特定类型。
Public Shared Function FindProgenitor(Of T As DependencyObject)(child As DependencyObject) As T
Dim parent As DependencyObject = VisualTreeHelper.GetParent(child)
Do Until parent Is Nothing OrElse TypeOf parent Is T
parent = VisualTreeHelper.GetParent(parent)
Loop
Return DirectCast(parent, T)
End Function
假设祖控件是 RootControl 类型,那么子控件中的使用情况类似于:
Dim myParent As RootControl = FindProgenitor(Of RootControl)(Me)
If myParent IsNot Nothing Then
' call method on RootControl instance myParent
End If
当您 link Child 控制 Parent 时,如您所显示的 child.setParent(Me)
,您可以有另一个 属性 和 link 到当前 Parent 的 TopParent 控件(随意命名)。例如。 me.TopControl = p.TopControl
在添加所有 children.
之前,您显然需要 determine/set TopControl
然后你可以像me.TopControl.deleteMe()
一样在任何地方调用它
我有一个 parent 控件,它实例化了 children 控件,它又可以进一步实例化 children。将命令或值从 grand-child 返回到顶部 parent 控件的最佳方法是什么?考虑这个例子:
child 控件有一个删除自身的按钮。但是实际删除的方法,从 GUI 中删除等,都是由顶部 parent 出于必要来处理的。
以下是我为此提供的两种方法,它们都有效:
- 当 parent 实例化 child 时,它会将对自身的引用传递给 child。这让 child 现在可以调用 parent 的 public 成员。在代码中,这看起来像:
'*~*~*~*~*~*~*~*~*~*~
'in the parent object
Dim child as new ChildObject
child.setParent(me)
'*~*~*~*~*~*~*~*~*~*~
'in the child object
public sub setParent(byref p as parentObject)
myParent = p
end sub
'now the child can interact with the parent
'for example:
myParent.deleteMe()
这适用于只有一个层次深度的情况。但是如果你有多个级别,它会很笨拙,你会做类似的事情:
myParent.myParent.myParent.deleteMe()
不酷。
- 我促成的另一种方法是使用 public 变量,该变量由顶部 parent 中的高速计时器监控。如果 child 需要一些 parent 方法 运行,那么它会将一个布尔值标记为 TRUE,计时器会监视它,然后调用适当的方法。但这需要一个 public 变量,我宁愿避免使用它。该方法还使用了一个耗资源的连续计时器。
问题:
这些是可以接受的实现目标的方法吗?有没有更好的办法?或者我什至需要这样做表明整体设计缺陷的事实?
我对 WPF 的工作不多,但我相信您可以使用 VisualTreeHelper.GetParent Method 来 向上移动 可视化树以找到特定类型。
Public Shared Function FindProgenitor(Of T As DependencyObject)(child As DependencyObject) As T
Dim parent As DependencyObject = VisualTreeHelper.GetParent(child)
Do Until parent Is Nothing OrElse TypeOf parent Is T
parent = VisualTreeHelper.GetParent(parent)
Loop
Return DirectCast(parent, T)
End Function
假设祖控件是 RootControl 类型,那么子控件中的使用情况类似于:
Dim myParent As RootControl = FindProgenitor(Of RootControl)(Me)
If myParent IsNot Nothing Then
' call method on RootControl instance myParent
End If
当您 link Child 控制 Parent 时,如您所显示的 child.setParent(Me)
,您可以有另一个 属性 和 link 到当前 Parent 的 TopParent 控件(随意命名)。例如。 me.TopControl = p.TopControl
在添加所有 children.
然后你可以像me.TopControl.deleteMe()