【问题标题】:Extending Checked event in derived TreeView control - how to temporarily remove event handlers?在派生的 TreeView 控件中扩展 Checked 事件 - 如何临时删除事件处理程序?
【发布时间】:2011-10-15 20:12:58
【问题描述】:

我想扩展(继承自)这个 Telerik 的 RadTreeView(Silverlight 版本)控件。 我们将新控件称为MyTreeView

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

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

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

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

【问题讨论】:

    标签: c# telerik custom-controls checked radtreeview


    【解决方案1】:

    您可以使用RadTreeViewCheckEventArgs.IsUserInitiated 属性。

    【讨论】:

    • 是的,我已经找到了 IsUserInitiated 属性。它解决了我的问题。三态选项已经具有此功能,但我不想要所有三种状态。所以我会坚持使用 IsUserInitiated。
    • 恕我直言,如果没有其他人回答您自己的问题,那么回答您自己的问题并没有错,因为最终有人一定会遇到同样的问题。 :)
    • 当然可以,但我前不久偶然发现了解决方案,所以我只是忘记回答了。随着时间的推移,我会回答它。 :)
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多