2012-07-17 161 views
1

我派生了一个自定义TreeNode类型,TreeNodeEx。在我的TreeNodeEx中,我订阅了分配给它的某个Value对象的NameChanged事件。此值的生命周期比树节点的生命周期长。处理树节点

我的想法是,当树节点被删除时,Value仍然通过事件处理程序委托引用树节点。所以这将保持对树节点的悬挂引用。

TreeNodeIDisposable,并没有事件或方法在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) { 
     // ... 
    } 
} 
+0

TreeView没有被设计为一个集合类,它只是擅长显示字符串。试图让它做得更好从来没有好的工作。将模型从视图中分离出来,以便只使用普通的TreeNodes并在您自己的集合类中执行需要的任何操作。 – 2012-07-17 19:50:54

+0

用户无法自行移除节点,因此,在代码中调用'treeView1.Nodes.Remove(...)'的时候是您应该处理处理任务的时间。 – LarsTech 2012-07-17 19:51:57

+0

@LarsTech Duh。打倒那个,是吧?做出答案,我会接受。 – 2012-07-17 19:53:51

回答

3

没有用户自行删除节点的方式,所以在你的代码在任何你在呼唤treeView1.Nodes.Remove(...)是当你要处理您的处置职责。