Странная утечка памяти в wpf

У меня странная проблема с утечкой памяти через MenuItem в wpf.

Я могу наблюдать эту утечку памяти в профилировщике памяти .net.

Наше приложение имеет следующую архитектуру:

MainWindow, которое шаблоны данных ApplicationPresenter. ApplicationPresenter действует в течение всего срока службы приложения. ApplicationPresenter имеет MainPresenter, который по существу представляет файл и его содержимое. Когда файл (решение) загружен, новый главный докладчик создается, а старый выбрасывается.

Шаблон данных для ведущего приложения выглядит следующим образом:

    <DataTemplate DataType="{x:Type ApplicationPresenter}">
        <ContentPresenter Content="{Binding Presenter}"/>
    </DataTemplate>

MainPresenter имеет несколько вкладок, но в основном его шаблон данных представляет собой большое меню внутри DockPanel. В меню есть несколько вложенных элементов, например, «Файл», «Редактировать», «Просмотр» ... в верхней части, а в «Файл» у вас есть «Создать», «Открыть» ... и затем подменю, такие как «Импорт», в которое затем загружаются элементы.

Все эти презентаторы реализуют INotifyPropertyChanged, и у нас есть реализация ICommand, которая преодолевает сумасшествие, связанное с этим (обычно команды не просачиваются в приложение).

Однако я вижу, что при открытии нового решения (или любой другой операции, которая создает новый MainPresenter) исходный MainPresenter (первый, который создается при загрузке приложения) зависает в памяти через поле _submenuPopup объекта MenuItem! Я приложил картинку из профилировщика, чтобы показать, что я имею в виду:

график утечки

Количество экземпляров не превышает двух, когда выполняется больше операций, и это всегда первый Presenter, который находится в памяти. Все меню работают (включая элементы в подменю)

Кто-нибудь знаком с этой проблемой и знает способ ее решения?

Это не очень важно, так как только одно решение означает, что оно не приведет к исключению OutOfMemoryException. Однако это может быть довольно дорого, так как программа может быть открыта двойным щелчком по файлам (это означает, что первый докладчик может хранить большой объем данных), что может удвоить использование памяти.

Ответы на вопрос(0)

Ваш ответ на вопрос