Reputation: 1217
In Xamarin for iOS development, is there a way I could refresh a view
from its ViewModel
?
I am using MVVMCross, if it helps.
Please advice.
Thanks.
Upvotes: 0
Views: 1001
Reputation: 146
What I do in my projects is to use MvvmCross' Messenger plugin to broadcast a message. Then in the View, subscribe for that message, and when one is broadcasted, refresh the view accordingly.
First, create a Message class extending MvxMessage.
public class RefreshViewMessage : MvxMessage
{
// Add other properties if needed
// public string SomeParameter { get; set; }
public RefreshViewMessage(object sender) : base(sender)
{
}
}
Second, broadcast that message in the ViewModel.
public class ViewModel : MvxViewModel
{
private IMvxMessenger _messenger;
public MainViewModel(IMvxMessenger messenger)
{
_messenger = messenger;
}
public void RefreshView()
{
_messenger.Publish(new RefreshViewMessage(this));
// Maybe some parameters need to be attached
// var message = new RefreshViewMessage(this) { SomeParameter = "stuff" };
// _messenger.Publish(message);
}
}
Third, subscribe for that message in the View.
public partial class View : MvxViewController<ViewModel>
{
public View(IntPtr handle) : base(handle) { }
public View() : base() { }
private IMvxMessenger _messenger;
private MvxSubscriptionToken _token; // keep a subscription token to prevent untimely garbage collection
public override void ViewDidLoad()
{
base.ViewDidLoad();
_messenger = Mvx.Resolve<IMvxMessenger>();
_token = _messenger.SubscribeOnMainThread<RefreshViewMessage>(OnRefreshView);
}
private void OnRefreshView(RefreshViewMessage message)
{
// Access data attached to the message if needed
// var param = message.SomeParameter;
// Refresh view
}
}
Upvotes: 2