Je clique sur un article de produit dans la vue de liste dans la vue de la page du produit pour afficher une fenêtre contextuelle (à l'aide de la fenêtre contextuelle rg.plugin) pour sélectionner l'une des variantes du produit.Après avoir sélectionné la variante, j'envoie la variante sélectionnée à la page du produit en utilisant le centre de messagerie de la variante pop-up page viewmodel, abonné au constructeur de viewmodel de page produit. fonctionne bien là-bas.Lorsque je navigue vers la page précédente, puis je suis revenu sur cette page de produit pour ajouter une ou plusieurs variantes au même produit précédemment sélectionné, l'abonnement à Messagingcenter a été appelé deux fois et la valeur du produit a augmenté deux fois. et se désabonner en disparaissant method.toujours appeler deux fois? Comment résoudre ce problème?
appelant le popup:
protected override void OnDisappearing() { var vm = BindingContext as store_page_vm; vm?.Save_cart(); MessagingCenter.Unsubscribe<Popup_variant_vm>(this, "selected_variant"); }
modèle de vue contextuelle: envoi de message
public Store_page() { InitializeComponent(); } protected override void OnAppearing() { base.OnAppearing(); var vm = new store_page_vm(); vm.Navigation = Navigation; BindingContext = vm; MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant"); MessagingCenter.Subscribe<Popup_variant_vm, object>(this, "selected_variant",async (sender, selected_variant) => { var vm1 = BindingContext as store_page_vm; vm1?.Addcart2(selected_variant);// called twice }); }
modèle de vue de la page produit: abonné ici .. appelé deux fois lors de la navigation de la page précédente à celle-ci
public Popup_variant_vm() { Radio_btn = new Command<Product_variant_list2>(Radio_stk_tapped); product_variant_list = new List<Product_variant_list2>(); purchaselist = new ObservableCollection<Product_list2>(); show_variants(); } internal void Confirm_variant() { if(App.Current.Properties.ContainsKey("selected_variant")) { MessagingCenter.Send<Popup_variant_vm, object>(this, "selected_variant", App.Current.Properties["selected_variant"]); //Message send from popup to product page } else { DependencyService.Get<IToast>().LongAlert("Please select any size"); } }
désabonné sur la page cs du produit
var result = await dataService.Get_product_variant(store_id, product_id); if (result.status == "success") { ind_vis = false; OnPropertyChanged("ind_vis"); App.Current.Properties["product_variant_result"] = result; App.Current.Properties["cartitems"] = purchaselist; App.Current.Properties["selected_product"] = product_List2 ; await PopupNavigation.Instance.PushAsync(new Popup_variant()); }
3 Réponses :
https://stackoverflow.com/a/44753021/10937160
essayez ceci et assurez-vous de ne pas appeler Abonnez-vous plus d'une fois.
Votre désabonnement devrait ressembler à quelque chose comme ci-dessous et cela devrait fonctionner:
MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
Ma solution:
mettre une phrase de désabonnement dans le corps de souscription !!
MessagingCenter.Subscribe<object, string>(this, "IdSearch", (sender, arg) => { listView.ItemsSource = arg; MessagingCenter.Unsubscribe<object, string>(this, "IdSearch"); }, BindingContext);
Combien d'instances de la page actuelle appelez-vous
@ G.hakim
public Store_page() { InitializeComponent(); }
seulementBindingContext as store_page_vm
appelé plusieurs fois@ G.hakim a oublié d'ajouter un
object
dansMessagingCenter.Unsubscribe<Popup_variant_vm>(this, "selected_variant");
... maintenant résoluJe l'ai ajouté comme réponse jetez un œil
@ G.hakim no ..
MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
cela a fonctionné.Done désolé je n'ai pas lu avant de poster