[英]Xamarin Forms MessagingCenter Subscribe called two times
我在產品頁面視圖模型的列表視圖中單擊產品項目以顯示用於選擇產品變體之一的彈出窗口(使用 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");
}
您的取消訂閱應該如下所示,並且應該可以正常工作:
MessagingCenter.Unsubscribe<Popup_variant_vm, object>(this, "selected_variant");
https://stackoverflow.com/a/44753021/10937160
試試這個,並確保你不要多次調用訂閱。
我的解決方案:
將取消訂閱語句放入訂閱正文中!!
MessagingCenter.Subscribe<object, string>(this, "IdSearch", (sender, arg) =>
{
listView.ItemsSource = arg;
MessagingCenter.Unsubscribe<object, string>(this, "IdSearch");
}, BindingContext);
我在我的應用程序中創建了靜態計數器變量,在訂閱者中我已經這樣做了:
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() 方法中重置計數器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.