Проблема с UserControl в ListBox с VirtualizationMode.Recycling - PullRequest
0 голосов
/ 20 февраля 2020

Я заполняю ListBox с VirtualizationMode.Recycling пользовательскими элементами управления UserControls:

<DataTemplate x:Key="MyDataTemplate">        
    <local:MyUserControl />
</DataTemplate>

И проблема в том, что при прокрутке пользователя перезапуск Listbox вызывает событие Unloaded, но не конструктор на новый элемент, который переписал бы его, приводя к пустым MyUserControl элементам в списке.

class MyUserControl : FrameworkElement
{   
    public MyUserControl()
    {
        Loaded += u_Loaded;
        Unloaded += u_Unloaded;
        SizeChanged += u_SizeChanged;
    }

    private void u_Unloaded(object sender, RoutedEventArgs e)
    {            
        Loaded -= u_Loaded;
        Unloaded -= u_Unloaded;
        SizeChanged -= u_SizeChanged;
    }

Если я исключаю событие Unloaded, это работает, но тогда нет способа предотвратить утечку памяти, отписавшись от SizeChanged (и дополнительные события мыши в будущем).

Если я закомментирую строку Loaded -= u_Loaded;, то рисование элемента будет работать, но тогда произойдет утечка памяти из-за сохранения этого события в проводном режиме?

Как правильно переписать все события при использовании режима виртуализации Recycling?

...