C# Xamarin Forms MessagingCenter 不更新项目通过
C# Xamarin Forms MessagingCenter not updating Item passed
我正在使用 MessagingCenter
通过我的页面传递对象,从我的 LoginPage 到我的 MainPage。
即使 object
已更新,但在我的主页上使用它时,该对象似乎为空。
public User sUser { get; set; }
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<LoginPage, User>(this, "currentUserMainPage", (obj, item) =>
{
sUser = item;
Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});
MasterBehavior = MasterBehavior.Popover;
MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);
}
当我在更改页面之前检查对象时,即使它不再为 null,它 returns 我还是 null。
public async Task NavigateFromMenu(int id)
{
if (!MenuPages.ContainsKey(id))
{
switch (id)
{
case (int)MenuItemType.Profile:
if(sUser == null)
{
MenuPages.Add(id, new NavigationPage(new LoginPage(sUser)));
}
else
{
MenuPages.Add(id, new NavigationPage(new ProfilePage(sUser)));
}
break;
}
}
}
知道我错过了什么吗?
编辑:这里是来自登录页面的调用
protected override async void OnAppearing()
{
base.OnAppearing();
try
{
//perform login
MessagingCenter.Send(this, "currentUserMainPage", aUser.User);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
首先你可以查看MessageCenter文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/messaging-center
订阅和发送消息时,我们需要保持参数的数量和类型相同。
例子如下:
发布消息: MessagingCenter.Send<MainPage, string>(this, "Hi", "John");
订阅消息:
MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
await DisplayAlert("Message received", "arg=" + arg, "OK");
});
你会看到第一个参数是 MainPage
,第二个是 string
。都需要在发布或者订阅的时候设置。
另外,不同页面之间使用MessageCenter或者类,可以用object
代替或者MainPage
.
因此,共享代码可以修改如下:
正在使用 object
订阅 MessageCenter :
MessagingCenter.Subscribe<object, User>(this, "currentUserMainPage", (obj, item) =>
{
sUser = item;
Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});
并发送消息也用 object
:
MessagingCenter.Send<object,User>(this, "currentUserMainPage", aUser.User);
我正在使用 MessagingCenter
通过我的页面传递对象,从我的 LoginPage 到我的 MainPage。
即使 object
已更新,但在我的主页上使用它时,该对象似乎为空。
public User sUser { get; set; }
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<LoginPage, User>(this, "currentUserMainPage", (obj, item) =>
{
sUser = item;
Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});
MasterBehavior = MasterBehavior.Popover;
MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);
}
当我在更改页面之前检查对象时,即使它不再为 null,它 returns 我还是 null。
public async Task NavigateFromMenu(int id)
{
if (!MenuPages.ContainsKey(id))
{
switch (id)
{
case (int)MenuItemType.Profile:
if(sUser == null)
{
MenuPages.Add(id, new NavigationPage(new LoginPage(sUser)));
}
else
{
MenuPages.Add(id, new NavigationPage(new ProfilePage(sUser)));
}
break;
}
}
}
知道我错过了什么吗?
编辑:这里是来自登录页面的调用
protected override async void OnAppearing()
{
base.OnAppearing();
try
{
//perform login
MessagingCenter.Send(this, "currentUserMainPage", aUser.User);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
首先你可以查看MessageCenter文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/messaging-center
订阅和发送消息时,我们需要保持参数的数量和类型相同。
例子如下:
发布消息: MessagingCenter.Send<MainPage, string>(this, "Hi", "John");
订阅消息:
MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
await DisplayAlert("Message received", "arg=" + arg, "OK");
});
你会看到第一个参数是 MainPage
,第二个是 string
。都需要在发布或者订阅的时候设置。
另外,不同页面之间使用MessageCenter或者类,可以用object
代替或者MainPage
.
因此,共享代码可以修改如下:
正在使用 object
订阅 MessageCenter :
MessagingCenter.Subscribe<object, User>(this, "currentUserMainPage", (obj, item) =>
{
sUser = item;
Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});
并发送消息也用 object
:
MessagingCenter.Send<object,User>(this, "currentUserMainPage", aUser.User);