Событие Control.VisibleChanged не создано - PullRequest
1 голос
/ 07 января 2011

Короткий вопрос:

Я заметил, что событие 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]

1 Ответ

1 голос
/ 07 января 2011

Не совсем понятно, но это звучит как проблема XY.Использование VisibleChanged сложно, оно не соответствует значению Visible, которое вы назначаете.Только фактическое состояние видимости.

Никоим образом не уведомляйте ListViewItems об измененном состоянии базовых данных.Я предполагаю, что вы используете производный класс с событием.Да, это приведет к утечке элементов, если источник события не будет собран.Вместо этого вызовите метод Invalidate () представления списка, чтобы заставить его перерисовать себя.Это вызовет событие RetrieveVirtualItem снова для всех видимых элементов, чтобы они отображали обновленные данные.Если вы хотите оптимизировать это, вызывая Invalidate только при обновлении видимого элемента, реализуйте событие CacheVirtualItems.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...