1
我派生了一个自定义TreeNode
类型,TreeNodeEx
。在我的TreeNodeEx
中,我订阅了分配给它的某个Value对象的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) {
// ...
}
}
TreeView没有被设计为一个集合类,它只是擅长显示字符串。试图让它做得更好从来没有好的工作。将模型从视图中分离出来,以便只使用普通的TreeNodes并在您自己的集合类中执行需要的任何操作。 – 2012-07-17 19:50:54
用户无法自行移除节点,因此,在代码中调用'treeView1.Nodes.Remove(...)'的时候是您应该处理处理任务的时间。 – LarsTech 2012-07-17 19:51:57
@LarsTech Duh。打倒那个,是吧?做出答案,我会接受。 – 2012-07-17 19:53:51