MvvmCross 将数据从一个视图模型传递到另一个视图模型
MvvmCross passing data from One viewmodel to another viewmodel
我正在研究 Xamarin Android Application.I 我正在为 ViewModels
使用 MvvmCross
模式。
现在,我想将数据从一个 ViewModel
传递到另一个视图模型,但不想导航到那个 ViewModel
。我不想导航到那个 ViewModel
,而是想导航到另一个 ViewModel
。
例如:我有三个 ViewModels
V1、V2 和 V3.Now 我想将数据从 V1 传递到 V2 但想导航到 V3。
这可能吗?
查看 MvvmCross Messenger 以执行此操作:https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger
您需要在视图模型上订阅某些内容:
public class LocationViewModel
: MvxViewModel
{
private readonly MvxSubscriptionToken _token;
public LocationViewModel(IMvxMessenger messenger)
{
_token = messenger.Subscribe<LocationMessage>(OnLocationMessage);
}
private void OnLocationMessage(LocationMessage locationMessage)
{
Lat = locationMessage.Lat;
Lng = locationMessage.Lng;
}
// remainder of ViewModel
}
最简单的方法是使用 MvvmCross.You 中的 Messenger Plugin 可以在 V2 中订阅某种消息并在 V1 中发布该消息,然后在单独的步骤中导航到 V3。
// subscribing to a certain message type
this.logoutToken = this.messenger.Subscribe<LogoutMessage>(this.HandleLogoutMessage);
// Creating and sending a message
var logoutMessage = new LogoutMessage(this, "You have been logged out.");
this.messenger.Publish(logoutMessage);
注意: 将 MessageToken
分配给成员变量很重要(就像在其他答案中一样),否则它会被垃圾清理收藏家。
上述 Messenger 插件的替代方案我建议将您需要共享的数据保存在 "service" 中,作为由 MvvmCross 管理的单例 class 服务:
CreatableTypes()
.EndingWith("Service")
.AsInterfaces()
.RegisterAsLazySingleton();
在您的视图模型中,您只需将其添加到构造函数中即可使用该单例:
public WhateverViewModel(IService service)
该服务将是单例的,因此您的数据将在应用程序生命周期内持续存在。
因此,在您的视图模型之一中,您可以执行以下操作:
service.SharedData = new SharedData();
在另一个视图模型中:
this.data = service.SharedData
我正在研究 Xamarin Android Application.I 我正在为 ViewModels
使用 MvvmCross
模式。
现在,我想将数据从一个 ViewModel
传递到另一个视图模型,但不想导航到那个 ViewModel
。我不想导航到那个 ViewModel
,而是想导航到另一个 ViewModel
。
例如:我有三个 ViewModels
V1、V2 和 V3.Now 我想将数据从 V1 传递到 V2 但想导航到 V3。
这可能吗?
查看 MvvmCross Messenger 以执行此操作:https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger
您需要在视图模型上订阅某些内容:
public class LocationViewModel
: MvxViewModel
{
private readonly MvxSubscriptionToken _token;
public LocationViewModel(IMvxMessenger messenger)
{
_token = messenger.Subscribe<LocationMessage>(OnLocationMessage);
}
private void OnLocationMessage(LocationMessage locationMessage)
{
Lat = locationMessage.Lat;
Lng = locationMessage.Lng;
}
// remainder of ViewModel
}
最简单的方法是使用 MvvmCross.You 中的 Messenger Plugin 可以在 V2 中订阅某种消息并在 V1 中发布该消息,然后在单独的步骤中导航到 V3。
// subscribing to a certain message type
this.logoutToken = this.messenger.Subscribe<LogoutMessage>(this.HandleLogoutMessage);
// Creating and sending a message
var logoutMessage = new LogoutMessage(this, "You have been logged out.");
this.messenger.Publish(logoutMessage);
注意: 将 MessageToken
分配给成员变量很重要(就像在其他答案中一样),否则它会被垃圾清理收藏家。
上述 Messenger 插件的替代方案我建议将您需要共享的数据保存在 "service" 中,作为由 MvvmCross 管理的单例 class 服务:
CreatableTypes()
.EndingWith("Service")
.AsInterfaces()
.RegisterAsLazySingleton();
在您的视图模型中,您只需将其添加到构造函数中即可使用该单例:
public WhateverViewModel(IService service)
该服务将是单例的,因此您的数据将在应用程序生命周期内持续存在。
因此,在您的视图模型之一中,您可以执行以下操作:
service.SharedData = new SharedData();
在另一个视图模型中:
this.data = service.SharedData