Короткий вопрос:
Я заметил, что событие Control.VisibleChanged не вызывается, когда свойство Visible изменяется с true на false.
Я читал этостатья, в которой подробно объясняется, как реализовано свойство Visible ( ссылка ).Это не решает мою проблему, так как я устанавливаю свойство Visible моего UserControl напрямую и не лежу на событии дочернего видимого состояния.
Чего мне не хватает?
Длинный вопрос:
У меня есть UserControl, содержащий ListView со многими элементами.ListView реализован с использованием виртуального режима, поэтому узлы создаются только при необходимости.
Элементы ListView должны обновляться самостоятельно при изменении связанного объекта;он знает, когда объект имеет событие ObjectChanged , которое уведомляет подписчиков при каждом изменении объекта.Таким образом, при создании ListViewItem, также подписаться на событие MyObject.ObjectChanged.
К сожалению, экземпляр MyObject почти не сохраняется в памяти (никогда не удаляется), но ListView в виртуальном режиме просит меня создать многоListViewItem, представляющий тот же объект.Поскольку созданные экземпляры ListViewItem подписаны на (постоянный) объект, они никогда не удаляются, что приводит к утечке памяти.
В противоположность этому, если созданные экземпляры ListViewItem не подписываются на событие ObjectChanged, они будут удаленыкак только GC проснется;но это было бы проблемой, так как узел не обновляет себя при изменениях.Обходной путь возможен, если UserControl отслеживает созданные экземпляры ListViewItem, но это сведет к минимуму преимущества ListView в виртуальном режиме.
Итак, я сдался.Я буду отслеживать каждый созданный узел.
Последовательно, я хотел сбросить коллекцию ListViewItem, когда UserControl становится невидимым, но ...
[Ref Short Question]