Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单MessagingCenter订阅两次_Xamarin_Xamarin.forms_Popup_Messagingcenter - Fatal编程技术网

Xamarin表单MessagingCenter订阅两次

Xamarin表单MessagingCenter订阅两次,xamarin,xamarin.forms,popup,messagingcenter,Xamarin,Xamarin.forms,Popup,Messagingcenter,我在product page viewmodel的listview中单击一个产品项目,以显示一个弹出窗口(使用rg.plugin popup)来选择一个产品变体。选择变体后,我将使用messagingcenter从变体弹出页面viewmodel发送所选变体到产品页面,在产品页面viewmodel构造函数中订阅。在那里工作正常。当我导航到上一页,然后返回到此产品页,以便向产品添加一个或多个变体时 与以前选择的产品相同,Messagingcenter subscribe呼叫了两次,产品价值增加了两次

我在product page viewmodel的listview中单击一个产品项目,以显示一个弹出窗口(使用rg.plugin popup)来选择一个产品变体。选择变体后,我将使用messagingcenter从变体弹出页面viewmodel发送所选变体到产品页面,在产品页面viewmodel构造函数中订阅。在那里工作正常。当我导航到上一页,然后返回到此产品页,以便向产品添加一个或多个变体时 与以前选择的产品相同,Messagingcenter subscribe呼叫了两次,产品价值增加了两次。尝试在产品页面中以“出现”和“消失”方式取消订阅。仍呼叫两次吗?如何解决这个问题

    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
        });            
    } 
调用弹出窗口:

               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 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
        });            
    } 
弹出视图模型:发送消息

        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
        });            
    } 
public Popup\u variant\u vm()
{
Radio_btn=新命令(Radio_stk_分接);
产品变量列表=新列表();
purchaselist=新的ObservableCollection();
显示变量();
}
内部无效确认_变量()
{
if(App.Current.Properties.ContainsKey(“选定的变量”))
{
MessagingCenter.Send(这是“选定的_变体”,App.Current.Properties[“选定的_变体”]);//从弹出窗口发送到产品页面的消息
}
其他的
{
DependencyService.Get().LongAlert(“请选择任意大小”);
}
}
产品页面视图模型:此处订阅..从上一页导航到此页面时调用两次

    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
        });            
    } 
public Store_page()
{
初始化组件();
}
出现时受保护的覆盖无效()
{
base.OnAppearing();
var vm=新存储\页面\虚拟机();
vm.Navigation=导航;
BindingContext=vm;
MessagingCenter.Unsubscribe(此“选定的变体”);
MessagingCenter.Subscribe(此“选定变量”,异步(发件人,选定变量)=>
{ 
var vm1=作为存储页面的BindingContext\u vm;
vm1?.Addcart2(选定的_变量);//调用两次
});            
} 
在产品cs页面中取消订阅

    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
        });            
    } 
protected override void OnDisappearing()
        {
            var vm = BindingContext as store_page_vm;
            vm?.Save_cart();    
            MessagingCenter.Unsubscribe<Popup_variant_vm>(this, "selected_variant");    
        }
protected override void OnDisappearing()
{
var vm=BindingContext作为存储\页面\虚拟机;
vm?.Save_cart();
MessagingCenter.Unsubscribe(此“选定的变体”);
}

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

请尝试此操作,并确保您不会多次呼叫Subscribe。

您的取消订阅操作应如下所示,并且应能正常工作:

    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
        });            
    } 
  MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
MessagingCenter.Unsubscribe(这是“选定的变量”);
我的解决方案:

    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
        });            
    } 
把取消订阅的句子放进订阅正文

    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
        });            
    } 
 MessagingCenter.Subscribe<object, string>(this, "IdSearch", (sender, arg) =>
            {
              

                listView.ItemsSource = arg;

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

            }, BindingContext);
MessagingCenter.Subscribe(此“IdSearch”,(发件人,参数)=>
{
listView.ItemsSource=arg;
取消订阅(此“IdSearch”);
},绑定上下文);

我已在订阅服务器的应用程序中创建了静态计数器变量,我已完成以下操作:

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

公共静态类常量
{
公共静态int msgcentersubscribebeconter{get;set;}=0;
}
MessagingCenter.Subscribe(这是“hello”,(发件人,arg)=>
{
常量.msgcentersubscribeccounter++;
if(arg.Equals(“hello”)&&Constants.msgcentersubscribebeconter==1)
{
//在这里处理你的逻辑
}
});

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

当前页面有多少个实例calling@G.hakim
public Store_page(){InitializeComponent();}
BindingContext作为Store_page_vm
调用多个times@G.hakim忘记在
MessagingCenter.Unsubscribe中添加
对象(这是“选定的变量”)
…现在我已经添加了它作为答案,请看它仍然不起作用,订户会被呼叫两次。
    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
        });            
    }