我正在使用Xamarin Forms中的master / detail模板。创建它时,其中的一件事情就是添加一个新项目。这采用按钮点击事件的形式:
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();
}
但是,我的消息从未收到。也就是说,如果我在按钮单击上设置了一个断点,则会广播该断点,但是订阅中的断点表明该断点永远不会到达。与现有消息相同的过程表明它可以发送和接收。
我可以在这里错过什么吗?
答案 0 :(得分:0)
MessagingCenter.Send <TSender,TArgs> (TSender, String, TArgs)
Send方法指定两个通用参数。第一种是发送消息的类型,第二种是正在发送的有效负载数据的类型。为了接收消息,订户还必须指定相同的通用参数。这样一来,多个共享消息标识但发送不同有效负载数据类型的消息将由不同的订户接收。
因此,您可以设置
MessagingCenter.Send<Item>(viewModel.Item, "Clicked");
项目在这里成为发件人,而不是参数。
如果要添加新的订阅,可以使用
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);
});