Extraña fuga de memoria wpf

Tengo un problema extraño con una pérdida de memoria a través de un MenuItem en wpf.

Puedo observar esta pérdida de memoria en el perfilador de memoria .net.

Nuestra aplicación tiene la siguiente arquitectura:

Un MainWindow que plantillas de datos un ApplicationPresenter. ApplicationPresenter dura toda la vida útil de la aplicación. ApplicationPresenter tiene un MainPresenter que esencialmente representa un archivo y su contenido. Cuando se carga un archivo (Solución), se crea un nuevo presentador principal y se desecha el anterior.

La plantilla de datos para el presentador de la aplicación se ve así:

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

MainPresenter tiene varias pestañas, pero básicamente su plantilla de datos es un gran menú dentro de un DockPanel. El menú tiene algunos elementos anidados, por ejemplo, Archivo, Editar, Ver ... en la parte superior y dentro del Archivo que tiene Nuevo, Abrir ... y luego submenús como Importar, que luego tiene una carga de elementos.

Todos estos presentadores implementan INotifyPropertyChanged y tenemos una implementación de ICommand que evita la locura asociada con eso (en general, los comandos no se filtran en la aplicación).

Sin embargo, lo que veo es que al abrir una nueva solución (o cualquier otra operación que cree un nuevo MainPresenter) es que el MainPresenter original (el primero que se crea cuando se carga la aplicación) se cuelga en la memoria a través del campo _submenuPopup de MenuItem! He adjuntado la imagen del generador de perfiles para ayudar a mostrar lo que quiero decir:

gráfico de fuga

La cantidad de instancias no supera las dos cuando se realizan más operaciones y siempre es el primer Presentador que está en la memoria. Los menús funcionan todos (incluidos los elementos en los submenús)

¿Alguien está familiarizado con este problema y conoce alguna forma de resolverlo?

No es masivamente crítico ya que solo una solución significa que no va a llevar a una excepción OutOfMemoryException. Sin embargo, puede ser bastante costoso, ya que el programa puede abrirse haciendo doble clic en los archivos (lo que significa que el primer presentador puede guardar una gran cantidad de datos), lo que podría duplicar el uso de la memoria de forma innecesaria.

Respuestas a la pregunta(0)

Su respuesta a la pregunta