在派生的TreeView控件中扩展Checked事件 - 如何临时删除事件处理程序?

时间:2011-07-29 10:14:06

标签: c# telerik custom-controls checked radtreeview

我想扩展(继承自)Telerik的RadTreeView(Silverlight版本)控件。 让我们调用新控件MyTreeView

我想要实现的是,当在MyTreeView中检查某个项目时,它会自动检查其所有子项目。此外,如果在检查节点后,其父节点已检查其所有子节点,我也想检查父节点。这将在整个树中递归到根。我似乎默认无法找到此功能。

我不需要用于检查项目的递归算法的解决方案,我可以自己轻松管理。我认为问题在于用户可以订阅CheckedUnchecked事件。因此,如果用户订阅了Checked事件,则每当检查项目时,将检查其所有子项,从而为每个子节点引发一个事件,该事件由于检查其父项而自动检查。 在我的场景中,这不是一个理想的行为。我希望事件仅针对手动检查的项目触发,而不是针对任何其他将自动检查的节点。

我以为我可以覆盖OnChecked方法,但它是私有的,或者没有这样的方法,所以我无法访问它。我可以在构造函数中向Checked事件添加另一个事件处理程序,该事件处理程序将在任何其他事件处理程序订阅事件之前调用,但这不会阻止子节点引发事件。我希望能够暂时取消订阅Checked上的处理程序,然后在检查节点后再次重新订阅它们。但是,由于我不知道谁订阅了一个事件,我无法手动取消订阅(事件是公开的),我似乎无法获得调用列表。

有没有办法迭代订阅的事件或任何其他方式暂时关闭它们?有没有更好的方法来解决所描述的问题?

1 个答案:

答案 0 :(得分:1)

您可以使用RadTreeViewCheckEventArgs.IsUserInitiated属性。