3

我在产品页面视图模型中单击列表视图中的产品项目以显示一个弹出窗口(使用 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());                   
                }

弹出视图模型:发送消息

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

4 回答 4

1

您的退订应如下所示,并且应该可以正常工作:

  MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
于 2019-02-12T10:41:27.283 回答
0

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

试试这个,并确保你不要多次调用订阅。

于 2019-01-24T07:17:37.880 回答
0

我的解决方案:

将取消订阅语句放入订阅正文!

 MessagingCenter.Subscribe<object, string>(this, "IdSearch", (sender, arg) =>
            {
              

                listView.ItemsSource = arg;

                MessagingCenter.Unsubscribe<object, string>(this, "IdSearch");

            }, BindingContext);
于 2020-11-25T19:11:27.670 回答
0

我在我的应用程序中创建了静态计数器变量,我已经这样做了:


public static class Constants
{
    public static int msgCenterSubscribeCounter { get; set; } = 0;
}

MessagingCenter.Subscribe<object, string>(this, "hello", (sender, arg) =>
{
    Constants.msgCenterSubscribeCounter++;
    if (arg.Equals("hello") && Constants.msgCenterSubscribeCounter == 1)  
    {
        // handle your logic here
    }
});

在调用 Send 的 OnDisappearing() 方法中重置计数器。

于 2021-04-16T10:25:08.070 回答