MAUI:WeakReferenceMessenger 正在调用多次?

问题描述 投票:0回答:1

我正在使用

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 秒的差异。

enter image description here

我需要在其他地方添加取消注册吗?用户可以在取消当前操作后执行相同的操作。所以永久注销是不可能的。

maui
1个回答
0
投票

过去,我大量使用 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");

当然,您可以将字符串内容替换为任何类,并向委托添加多个参数。

© www.soinside.com 2019 - 2024. All rights reserved.