example commandmanager c# listview memory-leaks windows-phone-8.1 mvvm-light

commandmanager - command mvvm c#



ListView Memory Leak Windows Phone 8.1? (1)

Tengo un ListView vinculado a una ObservableCollection de objetos (que contiene URI de imagen). Cuando agrego más elementos al ListView, veo un pico masivo en la memoria. Creo que me he reducido a un problema con la imagenUri del UserModel. vea abajo.

public class UserModel : ObservableObject { ... private string _imageUri; ... ... public string ImageUri { get { return _imageUri; } set { Set(() => ImageUri, ref _imageUri, value); } } }

modelo de fotografia

public class PhotoModel : ObservableObject { ... private UserModel _user; private string _imageUri; ... ... public UserModel User { get { return _user; } set { Set(() => User, ref _user, value); } } public string ImageUri { get { return _imageUri; } set { Set(() => ImageUri, ref _imageUri, value); } } }

Xaml Enlace de ListView

<ListView x:Name="MostPopularListView" ItemsSource="{Binding PhotosCollection}" ItemTemplate="{StaticResource MostPopularDataTemplate}" Margin="0,0,0,0" IsItemClickEnabled="True"/>

Plantilla Listview

... <Image Source="{Binding ImageUri}" Stretch="Fill" Height="300" /> ... <Ellipse Width="40" Height="40" Margin="10,0,0,10"> <Ellipse.Fill> <ImageBrush> <ImageBrush.ImageSource> <BitmapImage UriSource="{Binding User.ImageUri}" /> </ImageBrush.ImageSource> </ImageBrush> </Ellipse.Fill> </Ellipse> ...

Como puede ver, mi plantilla de datos ListView tiene dos imágenes, una para la foto real y otra para el usuario. Ambos se muestran correctamente, pero cuando continúo agregando más elementos a la lista, veo un pico masivo en la memoria.

Ver imagen:

Sin embargo, si no configuro UserModel.imageUri (UserModel.imageUri es null, entonces para todos los PhotoModels) no veo este pico en la memoria.

Ambos perfiles están llevando a cabo las mismas acciones cargando las mismas imágenes (total 15). La primera foto es con fotos del usuario y la segunda captura de pantalla está sin ella.

Creo que el problema tiene que ver con que PhotoModel tenga un UserModel y lo haga con Set (...). Como puede ver en las fotos a continuación, el controlador de eventos de cambio de propiedad tiene un recuento de 140.

La mayoría de estos son PhotoModels pero solo tengo 15 PhotoModels max en la Colección. Lo borro y vuelvo a agregar usando dos métodos de extensión (podría estar causándolo).

public static void Repopulate<T>(this ICollection<T> collection, IEnumerable<T> items) { collection.Clear(); foreach (var item in items) { collection.Add(item); } } public static void AddObjects<T>(this ICollection<T> collection, IEnumerable<T> items) { foreach (var item in items) { collection.Add(item); } }

Realmente agradecería algunos consejos sobre cómo manejar mejor el rendimiento y si esto es una pérdida de memoria.