当我在应用程序中多次往返导航时,在MessagingCenter.Subscribe()中编写的功能会被多次调用。但是每次在订阅之前,我都会在构造函数中取消订阅,如下所示,它仍然没有工作。
MessagingCenter.Unsubscribe<SubmitPage>(this,"Save");
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) =>
{
DisplayToastOnSuccessfulSubmission();
});在我的应用程序中,我有6页(git),我用MessagingCenter.Send将数据保存在第6页,同样在第2页中订阅,保存的消息将显示在第2页(导航到该页之后)。
现在,我以2->1->2->3->4->5->6的方式导航,在这种情况下,DisplayToastOnSuccessfulSubmission()将被调用两次(因为Page2构造函数被调用了两次)。
我甚至尝试在OnAppearing中放置相同的代码。我不能在OnDisappear中取消订阅,因为我需要事件连接,直到我到达Page6保存。
在示例项目中复制相同的行为,并在这里添加https://github.com/suchithm/MessageCenterSampleApp
做这件事的正确方法是什么?
发布于 2017-06-26 04:13:10
但是每次在订阅之前,我都会在构造函数中取消订阅,如下所示,它仍然没有工作。
MessagingCenter.Subscribe()被多次调用,因为在代码中有两个Page2实例,它们都使用MessagingCenter.Subscribe()方法,这就是Unsubscribe无法工作的原因。
您可以将page2()修改为单例,以确保项目中只有一个Page2实例,然后当您发送消息时,只调用MessagingCenter.Subscribe()一次。
第2.cs页:
public static Page2 instance = new Page2();
public static Page2 GetPage2Instance()
{
if(instance == null)
{
return new Page2();
}
return instance;
}
private Page2()
{
InitializeComponent();
MessagingCenter.Unsubscribe<Page2>(this, "SaveToastPage2");
MessagingCenter.Subscribe<Page2>(this, "SaveToastPage2", (sender) =>
{
DisplayToastOnSuccessfulSubmission();
}
}当你发送信息时:
MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2");编辑:
请记住,将Page2类的构造函数声明为私有,以确保项目中只有一个Page2实例。
private Page2()
{
...
}修改Page1.cs代码:
async void Handle_Next(object sender, System.EventArgs e)
{
await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}发布于 2020-03-16 17:54:30
我也面临着同样的问题。我通过传递相同的参数来解决问题,同时订阅和取消订阅。
MessagingCenter.Subscribe<Page1, T>(this, "Listen", async (Page1 arg1, T
listenedString) =>
{
});取消订阅,如下所示
MessagingCenter.Unsubscribe<Page1, T>(this, "Listen");发布于 2021-09-01 03:34:30
我用的是这个临时解决方案。我声明了一个静态字典来存储我的对象(对于这个例子,我使用了一个对象类型)。
private static Dictionary<string, object> subscribedReferencePages = new Dictionary<string, object>();我总是存储最后订阅的页面引用。然后,在触发message方法只触发最后一个消息之前,比较页面引用。
subscribedReferencePages[pageName] = this;
MessagingCenter.Subscribe<ViewModelBase>(this, pageName, async (sender) =>
{
if (!ReferenceEquals(sender, this))
{
return;
}
this.OnInitialized();
});要调用消息方法,我需要将字典作为参数传递(而不是"this“引用)。
MessagingCenter.Send(subscribedPages[pageName], keyPageName);https://stackoverflow.com/questions/44720764
复制相似问题