3
votes

Xamarin Forms MessagingCenter Subscribe appelé deux fois

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());                   
                }


7 commentaires

Combien d'instances de la page actuelle appelez-vous


@ G.hakim public Store_page() { InitializeComponent(); } seulement


BindingContext as store_page_vm appelé plusieurs fois


@ G.hakim a oublié d'ajouter un object dans MessagingCenter.Unsubscribe<Popup_variant_vm>(this, "selected_variant"); ... maintenant résolu


Je 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


3 Réponses :


0
votes

https://stackoverflow.com/a/44753021/10937160

essayez ceci et assurez-vous de ne pas appeler Abonnez-vous plus d'une fois.


0 commentaires

1
votes

Votre désabonnement devrait ressembler à quelque chose comme ci-dessous et cela devrait fonctionner:

  MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");


0 commentaires

0
votes

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);


0 commentaires