xamarin.forms - 如何在我的应用程序中与 ViewModel 进行通信?
问题描述
如何在我的应用程序中与我的 ViewModel 进行通信?
我有我的应用程序的这段代码、睡眠和恢复
protected override void OnSleep()
{
MessagingCenter.Send<App, string>(this, "gotosleep", "savedata");
}
在我的 ViewModel 中,我订阅了该消息,但它不起作用。我的消息永远不会显示。
public MyViewModel()
{
MessagingCenter.Subscribe<App, string>(this, "gotosleep", async (obj, item) =>
{
Console.WriteLine("HERE");
});
}
解决方案
您应该MyViewModel
在ContentPageSubscribe
中使用,然后MessagingCenter将起作用。
public MainPage()
{
InitializeComponent();
// Use model in Content Page
MyViewModel viewModel = new MyViewModel();
}
但是,我发现这不适用于 iOS 设备,但适用于 Android。
这是解决此问题的解决方法,您可以在初始化时将其ContentPage
作为ViewModel的属性传递。
public MyViewModel(MainPage mainPage)
{
MessagingCenter.Subscribe<App, string>(mainPage, "gotosleep", async (obj, item) =>
{
Console.WriteLine("HERE");
await mainPage.DisplayAlert("Message received", "arg=" + item, "OK");
});
}
在ContentPage中,修改如下:
public MainPage()
{
InitializeComponent();
// Use model in Content Page
MyViewModel viewModel = new MyViewModel(this);
}
iOS效果:
安卓效果:
推荐阅读
- css - 我的 CSS 和 JS 组织不工作
- sql - 复杂的 Oracle SQL 查询
- python - 使用多处理时的 ModuleNotFoundError
- html - 使用 CSS 添加图标
- javascript - 从数组创建多个路由和嵌套路由
- python - 你如何让一个精灵能够在pygame中检测鼠标是否在它上面?
- python - Python (PyPy) times.to_universal() 在 Alpine linux 上不起作用
- python - 如何找到一个数字在一组连续整数之间的位置
- angular - agGrid 不会根据自定义过滤器更新网格
- javascript - JavaScript - 并排显示两个表格