最佳实践:处理从 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 出于必要来处理的。

以下是我为此提供的两种方法,它们都有效:

  1. 当 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()

不酷。

  1. 我促成的另一种方法是使用 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()

一样在任何地方调用它