我正在使用
WeakReferenceMessenger
执行从 ViewModel
到其对应的 ContentPage
的一些操作。
WeakReferenceMessenger.Default.Unregister<DragCompletedMessage>(this);
WeakReferenceMessenger.Default.Register<DragCompletedMessage>(this, (recipient, message) =>
{
if (isSlidingActivitiesStarted)
{
isSlidingActivitiesStarted = false;
//API Call
}
});
我也像上面一样添加了
WeakReferenceMessenger Unregister
部分。
我的问题是 API 调用了 2 次,并且有 2 个项目在我的后端运行。我还尝试添加一个布尔变量
isSlidingActivitiesStarted
,并立即将其值更改为 false。这也没有解决我的问题。
我看到运行的项目之间只有 1 秒的差异。
我需要在其他地方添加取消注册吗?用户可以在取消当前操作后执行相同的操作。所以永久注销是不可能的。
过去,我大量使用 MessagingCenter(它是 WeakReferenceMessenger 的前身),但由于所有奇怪的恶作剧,例如多个订阅和很难跟踪它们,我现在使用委托和事件订阅。我建议尝试一下。
正常的工作是创建一个静态类并用委托、事件和调用事件的函数填充它。
public static class Sender
{
public delegate void SendData(string data);
public static event SendData OnSend;
public static void Send(string data)
{
OnSend?.Invoke(data);
}
}
然后我们返回到我们想要接收这些事件的页面:
protected override void OnAppearing()
{
Sender.OnSend += myFunc;
base.OnAppearing();
}
protected override void OnDisappearing()
{
Sender.OnSend -= myFunc;
base.OnDisappearing();
}
现在我可以确定当时只有 1 个页面收到消息。
最后一部分是发送消息,这是最简单的,只需调用您在静态类中创建的函数即可:
Sender.Send("data");
当然,您可以将字符串内容替换为任何类,并向委托添加多个参数。