2012-07-17 163 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(...)是當你要處理您的處置職責。