C# 三烯醚的处理

C# 三烯醚的处理,c#,winforms,C#,Winforms,我已经派生了一个自定义的TreeNode类型,TreeNodeEx。在我的TreeNodeEx中,我订阅了分配给它的某个值对象的NameChanged事件。此值的生存期长于树节点的生存期 我的想法是,当删除树节点时,Value仍然通过事件处理程序委托引用树节点。因此,这将保留对树节点的悬空引用 TreeNode不可IDisposable,并且在TreeNode中没有可重写的事件或方法,无法知道何时将其删除,以及何时应从事件中解除挂钩。那么,我怎么知道什么时候该脱钩呢 class TreeNode

我已经派生了一个自定义的
TreeNode
类型,
TreeNodeEx
。在我的
TreeNodeEx
中,我订阅了分配给它的某个值对象的
NameChanged
事件。此值的生存期长于树节点的生存期

我的想法是,当删除树节点时,Value仍然通过事件处理程序委托引用树节点。因此,这将保留对树节点的悬空引用

TreeNode
不可
IDisposable
,并且在
TreeNode
中没有可重写的事件或方法,无法知道何时将其删除,以及何时应从事件中解除挂钩。那么,我怎么知道什么时候该脱钩呢

class TreeNodeEx : TreeNode {
    private Foo m_value;
    public Foo Value {
        get { return m_value; }
        set {
            if (m_value != null) {
                m_value.NameChanged -= ValueNameChanged;
            }

            m_value = value;

            if (m_value != null) {
                m_value.NameChanged += ValueNameChanged;
            }
        }
    }

    private void ValueNameChanged(object sender, EventArgs e) {
        // ...
    }
}

用户无法自行删除节点,因此在您的代码中调用
treeView1.Nodes.remove(…)
时,您应该处理您的处理任务。

TreeView不是设计为集合类的,它只擅长显示字符串。试图让它做得更多永远不会有好结果。将模型与视图分开,这样您就可以使用普通树节点,并在自己的集合类中执行任何需要执行的操作。用户无法自行删除节点,因此在您的代码中调用
treeviw1.Nodes。删除(…)
是您应该处理处理任务的时间。@LarsTech Duh。想得太多了,嗯?回答这个问题,我就接受。@HansPassant不是我在
TreeNodeCollection
中“存储”值,而是
TreeNodeEx
中有一个功能要求它引用它所表示的项。