Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-树子项需要在其构造函数中引用其父节点,但它';仅在构造函数之后收到-需要解决方案_C#_Wpf_Treeview_Tree - Fatal编程技术网

C# WPF-树子项需要在其构造函数中引用其父节点,但它';仅在构造函数之后收到-需要解决方案

C# WPF-树子项需要在其构造函数中引用其父节点,但它';仅在构造函数之后收到-需要解决方案,c#,wpf,treeview,tree,C#,Wpf,Treeview,Tree,我在C#中得到了一个树结构 树中的每个节点都包含对父节点和子节点集合的引用。 创建子节点的过程同样是- 父节点创建子项 子级运行其所有构造函数逻辑 子对象退出其构造函数后,其实例将添加到父对象的子对象集合中,子对象的父对象属性将相应更新 到目前为止,这对我来说非常有效。 我遇到了这样一种情况:一些对象需要引用其构造函数中已经存在的父对象,即使它们还没有父对象,并且只有在它们退出构造函数并添加到父对象集合后才会收到父对象的引用。(如第三阶段) 我想到了一个可能的解决方案,但我不确定- 创建时,每个

我在C#中得到了一个树结构

树中的每个节点都包含对父节点和子节点集合的引用。 创建子节点的过程同样是-

  • 父节点创建子项
  • 子级运行其所有构造函数逻辑
  • 子对象退出其构造函数后,其实例将添加到父对象的子对象集合中,子对象的父对象属性将相应更新
  • 到目前为止,这对我来说非常有效。 我遇到了这样一种情况:一些对象需要引用其构造函数中已经存在的父对象,即使它们还没有父对象,并且只有在它们退出构造函数并添加到父对象集合后才会收到父对象的引用。(如第三阶段)

    我想到了一个可能的解决方案,但我不确定-

    创建时,每个父节点应将自身传播到其子节点。这种情况的问题是构造函数有点笨拙,但父属性也会设置两次。第2步一次,第3步一次

    我想这一定是一个常见的问题,因此一定有人找到了更好的解决方案

    只是为了一般知识-此树结构是基于ViewModel的WPF的TreeView

    如有评论,将不胜感激


    谢谢

    我认为您有两种选择之一:

  • 将父级添加为构造函数参数(并非异常)
  • 使依赖于父级的逻辑仅在父级运行时运行 通过侦听属性更改事件或通过 重写OnParentChanged受保护的虚拟方法(可能是 更好的解决方案)。这假设您宣布父项更改 使用标准访问器、属性更改通知程序 (INotifyPropertyChanged)和受保护的虚拟方法访问点 为了举办这次活动。作为根事件的引发者,最好 在受保护的方法中处理自定义逻辑

  • 我更喜欢第二种解决方案,因为如果节点恰好被重新设置为父节点,它将允许您重新运行逻辑。它还允许从树上修剪节点(Parent=null)。

    我要问的第一个问题是:为什么父类不实现这样的方法

    public void AddChild(object parameters)
    {
       Children.Add(new ChildNode(this, parameters));
    }
    

    您的应用程序中是否存在可以创建
    ChildNode
    对象的其他情况?如果是,它是什么,它为什么存在?

    您可以在设置它之前检查父属性是否为null,从而避免设置两次。如果这是我们正在讨论的一个效率问题,我会在构造函数中设置它一次,然后就不做了。很抱歉响应太晚,最后我添加了父参数作为参数。