mshwf
mshwf

Reputation: 7449

MessagingCenter.Subscribe in not listening to outsider messages?

I'm loading the page's data in the OnAppearing method, but this causes loading data in situations where it doesn't change, like calling PopupAsync() from another page. so I thought the messaging center would help. I made a flag field in the page, and subscribed to any message coming from outside to decide whether to update data or not, for example this from the MenuViewModel (when the user first opens the page, so I need to load data):

var p = new FeedbackListPage();
MessagingCenter.Send(this, "loadData", "1");
await Navigation.PushAsync(p);

and in the FeedbackListPage's constructor:

InitializeComponent();
BindingContext = vm = new FeedbackViewModel(Navigation);
MessagingCenter.Subscribe<string>(this, "loadData", ( _loadData) =>
   {
      loadDataStr = _loadData;
   });

and in the OnAppearing:

protected override void OnAppearing()
        {
            base.OnAppearing();
            if (loadDataStr=="1")
               vm.OnLoadFeedbacks();
        }

the problem is that the Subscribe's action is never called!

Upvotes: 0

Views: 539

Answers (2)

nevermore
nevermore

Reputation: 15796

Solution:

The API for MessagingCenter:

1.Subscribe<TSender> (object subscriber, string message, Action<TSender> callback, TSender source = null)

2.Subscribe<TSender, TArgs> (object subscriber, string message,Action<TSender, TArgs> callback, TSender source = null)

So, if you want to pass an Argument using MessageCenter, you should define both Sender and Args:

  MessagingCenter.Subscribe<MainPage,string>(this, "loadData", (sender,_loadData) =>
            {
                loadDataStr = _loadData;
            });

Refer: messaging-center

Upvotes: 1

GeralexGR
GeralexGR

Reputation: 3582

You can try the following:

use MessagingCenter.Send to send the signal when you want to update the data from any page and then in your ViewModel's constructor use MessagingCenter.Subscribe to perform the needed action

Send:

MessagingCenter.Send<namespace.App>((namespace.App)Xamarin.Forms.Application.Current, "update");

Subscribe:

MessagingCenter.Subscribe<namespace.App>((namespace.App)Application.Current, "update", (sender) => {
                // update - get data
            });

Upvotes: 0

Related Questions