I miei risultati finora ...
Oltre a PRISM, Unità, WPF e MVVM ci sono anche utilizzando Entity Framework e la griglia di dati Xceed. Il profiling della memoria è stato fatto usando dotTrace.
Ho finito per implementare IDisposable su una classe di base per i miei modelli di vista con il metodo Dispose (bool) che è stato dichiarato virtuale consentendo alle sottoclassi la possibilità di ripulire. Dato che ogni modello di vista nella nostra applicazione ottiene un contenitore figlio da Unity, lo smaltiamo, nel nostro caso questo assicura che l'ObjectContext di EF sia andato fuori campo. Questa era la nostra principale fonte di perdite di memoria.
Il modello di vista è disposto all'interno di un metodo CloseView (UserControl) esplicito su una classe di controller di base. Cerca un IDisposable sul DataContext della vista e chiama Dispose su di esso.
La griglia di dati Xceed sembra causare una buona parte delle perdite, specialmente nelle visualizzazioni di lunga durata. Qualsiasi vista che aggiorna l'ItemSource della griglia di dati assigendo una nuova raccolta dovrebbe chiamare Cancella() sulla raccolta esistente prima di assegnarne una nuova.
Fare attenzione a Entity Framework ed evitare qualsiasi contesto di oggetti a esecuzione prolungata. È molto spietato quando si tratta di collezioni di grandi dimensioni, anche se hai rimosso la raccolta se il tracciamento è attivato, conterrà un riferimento a tutti gli elementi della collezione anche se non li hai più appesi.
Se non è necessario aggiornare l'entità, recuperarlo con MergeOption.NoTracking, in particolare nelle viste di lunga durata che si associano alle raccolte.
Evitare visualizzazioni con una lunga durata, non tenerle in una regione quando non sono visibili, questo causerà dolore soprattutto se aggiornano i dati a intervalli regolari quando sono visibili.
Quando si utilizza CellContentTemplates sulla colonna Xceed, non utilizzare le risorse dinamiche poiché la risorsa conterrà un riferimento alla cella, che a sua volta manterrà attiva l'intera vista.
Quando si utilizza CellEditor nella colonna Xceed e la risorsa è memorizzata in un dizionario di risorse esterno, aggiungere x: Shared = "False" alla risorsa contenente CellEditor, ancora una volta la risorsa conterrà un riferimento alla cella, utilizzando x : Shared = "False" garantisce di ottenere una nuova copia ogni volta, con il vecchio rimosso correttamente.
Fare attenzione quando si associa il DelegateCommand agli elementi all'interno della griglia di dati Exceed, se si dispone di un caso come un pulsante di eliminazione sulla riga che si lega a un comando, assicurarsi di cancellare la raccolta contenente ItemsSource prima di chiudere la vista . Se si sta aggiornando la raccolta, è necessario reinizializzare il comando e il comando manterrà un riferimento a ogni riga.
LOL, È un buco profondo in cui mi sto scavando qui;) Ero curioso di sapere su cosa è collegato il tuo comportamento collegato a UserControl, ho cercato un modo per rilevare quando la vista è stata interrotta. Unloaded sembra la scelta più ovvia, ma non è di grande aiuto perché si attiva ogni volta che la vista diventa inattiva –
Ah è personalizzato.Ogni volta che una vista deve chiuderla, chiamerà un metodo su un insieme di comandi dell'applicazione che abbiamo. CloseView (vista oggetto). Controllo con lo store dietro la proprietà allegata per vedere se quella vista o una delle sue viste secondarie sono registrate per avere gestori di chiusura. Se è così, chiamo il metodo che hanno registrato. L'unica magia qui è l'uso delle classi LogicalTreeHelper e VisualTreeHelper per individuare le viste secondarie. http://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper.aspx –
Abbiamo provato anche a scaricare, btw. In alcuni casi era ok ... avremmo fermato i timer che essenzialmente erano solo dati di aggiornamento e non c'era alcun motivo per aggiornarlo se la vista non era visibile (come se fosse su schede o qualcosa del genere), ma a volte tu ho solo bisogno di un timer per non fermarsi mai a meno che la vista non venga uccisa e questa cosa esplicita è la cosa migliore che siamo riusciti a trovare. –