MvvmCross; Comment RaisePropertyChange à partir d’un autre ViewModel

J’ai une liste ShoppingCart avec des éléments liés à ShopingCartViewModel . Lorsque je clique sur un élément, il me conduit à ItemInfoFragment qui est lié à ItemInfoViewModel .

Dans ItemInfoFragment, j’ai un bouton qui supprime l’ élément et le supprime de la liste de magasinage .

Mon problème est ; Après avoir supprimé l’ article et appuyé sur le bouton Précédent pour revenir à mon activité précédente , le panierCartView affiche toujours l’ article que j’ai supprimé .

Ma question est; Comment éleverPropertyChange dans ShoppingCartViewModel lorsque je quitte le ItemInfoFragment?

Je crois que vous avez quelques options:

Stockage persistant partagé

Si vous utilisez une solution de stockage / mise en cache telle que SQLite ou Realm, etc., qui peut être utilisée pour lire et modifier les mêmes données de panier d’achat entre les pages. Vous pouvez ensuite utiliser les événements de cycle de vie de la vue ( OnResume [Android] ou ViewWillAppear [iOS]) pour récupérer les dernières informations en mémoire cache.

Si la taille des données du panier d’achat est petite, vous pouvez également la lire / l’écrire dans le plug-in MvvmCross Settings . Vous aurez juste à sérialiser et désérialiser vos objects car vous ne pouvez sauvegarder que des types basiques tels que des chaînes, des bools, des int, etc.

Instance partagée d’dependency injection

Vous pouvez créer un cache en mémoire en utilisant une instance de classe partagée qui peut être partagée entre plusieurs ViewModels. Les propriétés de cette classe peuvent être directement reliées à vos différentes vues. Toute modification apscope à la liste mettra à jour toutes les vues qui s’y rattachent. Une chose à noter est que vous devrez gérer manuellement le nettoyage si vous avez besoin de l’espace mémoire occupé par la classe d’instance this.

Exemple:

Exemple de modèle

 public class ItemInfo { public int Id { get; set; } public ssortingng Name { get; set; } public double Price { get; set; } } 

Instance de classe partagée et interface

 public interface ISharedShoppingCart { MvxObservableCollection ShoppingCartItems { get; set; } } public class SharedShoppingCart : MvxNotifyPropertyChanged, ISharedShoppingCart { MvxObservableCollection _shoppingCartItems; public MvxObservableCollection ShoppingCartItems { get { return _shoppingCartItems; } set { SetProperty(ref _shoppingCartItems, value); } } } 

Assurez-vous d’enregistrer la classe et l’interface

 public class App : MvxApplication { public override void Initialize() { /* Other registerations*/ Mvx.LazyConstructAndRegisterSingleton(); } } 

Exemple d’utilisation dans les modèles de vue partagés

 public class ShopingCartViewModel : MvxViewModel { readonly ISharedShoppingCart _sharedShoppingChart; public ShopingCartViewModel(ISharedShoppingCart sharedShoppingChart) { _sharedShoppingChart = sharedShoppingChart; } public MvxObservableCollection ShoppingCartItems { get { return _sharedShoppingChart.ShoppingCartItems; } set { _sharedShoppingChart.ShoppingCartItems = value; } } } public class ItemInfoViewModel : MvxViewModel { readonly ISharedShoppingCart _sharedShoppingCart; public ItemInfoViewModel(ISharedShoppingCart sharedShoppingCart) { _sharedShoppingCart = sharedShoppingCart; } void RemoveItemFromCart(int id) { _sharedShoppingCart.ShoppingCartItems .Remove(_sharedShoppingCart.ShoppingCartItems.Single(x => x.Id == id)); } } 

Pub / Sub

Vous pouvez envoyer des messages au panier ViewModel à l’aide du plug – in MvvmCross Messenger .