如何以xamarin形式使用消息中心

Yog*_*esh 4 xamarin xamarin.forms

我正在尝试使用消息中心而不是 xamarin 表单中的 Messenger 我不知道消息中心 我尝试使用以下代码以 xamarin 表单订阅和发送消息

MessagingCenter.Send(this, "TodoTable", "Todo");
Run Code Online (Sandbox Code Playgroud)

但我不知道从哪里可以订阅此消息,我尝试了以下代码:

MessagingCenter.Subscribe<TodoClass>(this, Todo, async (sender, arg) =>
{
  await RefreshCommand.ExecuteAsync();
});
Run Code Online (Sandbox Code Playgroud)

这给了我错误任何帮助将不胜感激:)

use*_*546 5

XF 消息中心的一个怪癖是(看起来)您需要知道谁将发送消息,以及可能谁将接收消息。

然而它可以是对象。订阅的签名是:

void MessagingCenter.Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender sender = null)
Run Code Online (Sandbox Code Playgroud)

诀窍是这样订阅:

MessagingCenter.Subscribe<object>(this, "messageName", Action<object> callback)
Run Code Online (Sandbox Code Playgroud)

这表示对象或从对象派生的任何东西都可以是发送者,即一切。

但是,如果您只想订阅特定类型实例发送的消息:

MessagingCenter.Subscribe<MyClass>(this, "messageName", Action<MyClass> callback)
Run Code Online (Sandbox Code Playgroud)

使用完整签名有点可疑。基本上,它是说仅当从源对象发送的是在订阅时使用该源对象的订阅者时。

  MessagingCenter.Subscribe<object, string>(this, "Hi", 
      (sender, arg) =>
      {
        DisplayAlert("Message Received", "arg=" + arg, "OK");
      },
      BindingContext);
Run Code Online (Sandbox Code Playgroud)

如果您使用以下命令发送消息,上面的订阅者将不会收到该消息:

  MessagingCenter.Send<object, string>(this, "Hi", "John");
Run Code Online (Sandbox Code Playgroud)

但会收到以下内容

  MessagingCenter.Send<object, string>(BindingContext, "Hi", "John");
Run Code Online (Sandbox Code Playgroud)

但为什么你想给自己发消息呢?(假设在这种情况下订阅和发送位于同一页面)。

但是,如果多个页面具有完全相同的绑定上下文,则消息将被发送到所有此类订阅者。例如,页面绑定到相同的视图模型。