Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 未引发Control.VisibleChanged事件_.net_Winforms_Events_Listview - Fatal编程技术网

.net 未引发Control.VisibleChanged事件

.net 未引发Control.VisibleChanged事件,.net,winforms,events,listview,.net,Winforms,Events,Listview,简短问题: 我注意到当Visible属性从true更改为false时,不会触发Control.VisibleChanged事件 我读过这篇文章,它深入地解释了Visible属性是如何实现的()。这并不能解决我的问题,因为我直接设置了UserControl的Visible属性,并且我不依赖于子Visible state事件 我错过了什么 长问题: 我有一个UserControl,它包含一个包含许多元素的ListView。ListView使用虚拟模式实现,因此仅在必要时创建节点 当相关对象发生变化时

简短问题:

我注意到当Visible属性从true更改为false时,不会触发Control.VisibleChanged事件

我读过这篇文章,它深入地解释了Visible属性是如何实现的()。这并不能解决我的问题,因为我直接设置了UserControl的Visible属性,并且我不依赖于子Visible state事件

我错过了什么

长问题:

我有一个UserControl,它包含一个包含许多元素的ListView。ListView使用虚拟模式实现,因此仅在必要时创建节点

当相关对象发生变化时,ListView项应更新自身;它知道对象何时发生了ObjectChanged事件,该事件在对象发生更改时通知订阅者。因此,在构造ListViewItem时,也是subscribe to MyObject.ObjectChanged事件

遗憾的是,MyObject实例在内存中几乎是持久的(从未被释放),但虚拟模式下的ListView要求我创建许多表示相同对象的ListViewItem。由于创建的ListViewItem实例已订阅(持久)对象,因此它们永远不会被释放,从而导致内存泄漏

在对等的情况下,如果创建的ListViewItem实例没有订阅ObjectChanged事件,那么GC一醒来就会处理它们;但这将是一个问题,因为节点不会根据更改进行自我更新。如果UserControl跟踪已创建的ListViewItem实例,则可能会出现一种解决方法,但这会使虚拟模式下ListView的好处最小化

所以,我不得不放弃。我将跟踪每个创建的节点

接下来,我想在UserControl不可见时重置ListViewItem集合,但是


[Ref Short Question]

不能完全理解这一点,但这听起来像是一个XY问题。使用VisibleChanged很棘手,它不遵循您指定的Visible值。仅显示实际的可见性状态


不要以任何方式使ListViewItems知道基础数据的更改状态。我猜您正在使用带有事件的派生类。是的,如果没有收集到事件源,这将泄漏项目。相反,调用列表视图的Invalidate()方法强制它重新绘制自身。它将再次引发任何可见项的RetrieveVirtualItem事件,以便它们显示更新的数据。如果要对此进行优化,只在更新可见项时调用Invalidate,然后实现CacheVirtualItems事件。

不能完全遵循这一点,但听起来像是XY问题。使用VisibleChanged很棘手,它不遵循您指定的Visible值。仅显示实际的可见性状态


不要以任何方式使ListViewItems知道基础数据的更改状态。我猜您正在使用带有事件的派生类。是的,如果没有收集到事件源,这将泄漏项目。相反,调用列表视图的Invalidate()方法强制它重新绘制自身。它将再次引发任何可见项的RetrieveVirtualItem事件,以便它们显示更新的数据。如果要对此进行优化,请仅在更新可见项时调用Invalidate,然后实现CacheVirtualItems事件。

CacheVirtualItems在使ListView无效后提供实际显示项的范围?请毫不犹豫地尝试。StartIndex和EndIndex属性告诉您正在查看的内容。CacheVirtualItems提供了使ListView无效后实际显示项目的范围?请不要犹豫,尝试一下。StartIndex和EndIndex属性告诉您正在查看的内容。