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
中有一个功能要求它引用它所表示的项。