Xamarin Forms MessagingCenter Подписка вызывается два раза - PullRequest
0 голосов
/ 24 января 2019

Я нажимаю на элемент продукта в просмотре списка в модели представления страницы продукта, чтобы показать всплывающее окно (используя всплывающее окно rg.plugin) для выбора одного из вариантов продукта. После выбора варианта я отправляю выбранный вариант на страницу продукта с помощью Центр обмена сообщениями из варианта представления всплывающей страницы, подписанный в конструкторе представления модели страницы продукта. работает нормально там. Когда я перехожу на предыдущую страницу, а затем вернулся на эту страницу продукта для добавления одного или нескольких вариантов к тот же ранее выбранный продукт, Messagingcenter вызывается дважды, и стоимость продукта увеличивается вдвое. Как решить эту проблему?

вызов всплывающего окна:

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

popmo viewmodel: отправка сообщения

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

модель просмотра страницы продукта: подписана здесь .. вызывается дважды при переходе с предыдущей страницы на эту

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

отписался на странице товара cs

protected override void OnDisappearing()
        {
            var vm = BindingContext as store_page_vm;
            vm?.Save_cart();    
            MessagingCenter.Unsubscribe<Popup_variant_vm>(this, "selected_variant");    
        }

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваша отписка должна выглядеть примерно так, как показано ниже, и она должна работать:

  MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
0 голосов
/ 24 января 2019

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

попробуйте и убедитесь, что вы не звоните Подписаться больше, чем один раз.

...