Xamarin 中的 MessageCenter 似乎没有收到特定消息

MessageCenter in Xamarin doesn't seem to receive a specific message

我正在研究 Xamarin Forms 中的主/详细信息模板。创建它时,其中的一件事就是添加一个新项目;这采用按钮单击事件的形式:

async void Save_Clicked(object sender, EventArgs e)
{
    MessagingCenter.Send(this, "AddItem", Item);
    await Navigation.PopModalAsync();
}

以及对此的订阅:

MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
    var newItem = item as Item;
    Items.Add(newItem);
    await DataStore.AddItemAsync(newItem);
});

这很好用(很明显),所以我试着模仿它;我添加了一个新订阅:

MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
    var newItem = item as Item;
    Items.Add(newItem);
    await DataStore.AddItemAsync(newItem);
});

MessagingCenter.Subscribe<ItemDetailPage, Item>(this, "Clicked", async (obj, item) =>
{   
    var i = item as Item;
    Items.Remove(i);
    await DataStore.DeleteItemAsync(i.Id);                
});

然后通过 ItemDetailPage 上的新按钮广播:

private async void MyButton_Clicked(object sender, EventArgs e)
{
    MessagingCenter.Send<Item>(viewModel.Item, "Clicked");
    await Navigation.PopAsync();
}

但是,我的消息从未收到。也就是说,如果我在按钮点击上放置一个断点,它会被广播,但是订阅中的一个断点显示它永远不会到达;与现有消息相同的过程显示它发送和接收。

我会不会漏掉了什么?

MessagingCenter.Send <TSender,TArgs> (TSender, String, TArgs)

Send 方法指定了两个通用参数。第一个是发送消息的类型,第二个是发送的有效负载数据的类型。要接收消息,订阅者还必须指定相同的通用参数。这使得共享消息标识但发送不同负载数据类型的多个消息能够被不同的订阅者接收。

因此,在您的情况下,您设置了

MessagingCenter.Send<Item>(viewModel.Item, "Clicked");

Item 在这里成为 Sender ,而不是 args.

如果要添加新订阅,可以使用

MessagingCenter.Send<Object,Item>(viewModel.Item, "Clicked");

MessagingCenter.Subscribe<Object, Item>(this, "Clicked", async (obj, item) =>
{   
    var i = item as Item;
    Items.Remove(i);
    await DataStore.DeleteItemAsync(i.Id);                
});